golang水平扩展interface wrapper function
文章目录
golang水平扩展interface wrapper function
什么是 Golang 的正交组合 - 水平组合思维:Tony Bai 的博客 - Coding in GO way - Orthogonal Composition
这篇文章研究其中提到的 interface wrapper function。
|
|
这是一个最简单的,定义了一个 Shower 的接口并声明了 Show 方法,满足这个接口的类型Type.Show()
将在屏幕显示用户定义的一段文字。
随后我们需要为这个 Shower 接口添加一个实例。例如我们添加一个数据类型使他能够显示Demo:
user-string
:
|
|
这段代码是否应该属于package show
? 不是,因为实现 Show() 方法不止这一种。例如我们还可以:
|
|
接下来我们可以在 main.go 中使用这个接口和对应的方法:
|
|
我们一般用一个函数来包装参数,使之直接返回一个接口类型。这是 interface warp function 的其中一种用法:
|
|
在 main.go 中使用这个方法来创建接口:
|
|
注意在写 interface warp 的时候返回类型必须是接口类型,即func NewShow(s string) Show {return &Show{s}}
或func NewShow(s string) *Show {return &Show{s}}
都是错误的。虽说他们或许可以成功执行ds.Show()
操作,但他们都只是一个结构体,也就是执行ds.(show.Shower)
类型断言时编译器会抛出错误。
以上都是很基础的部分。接下来我们考虑一个需求,即我们需要用一个方法(接口)来实现将字符串连续打印多遍的功能。例如在 stl 中LimitedReader
的实现方法。为此,我们创建一个结构体 ShowMultiTimes 并继承 Shower:
|
|
可以发现,这个方法应该同时对所有 Shower 的实现类型生效。同时他打印的内容也与 Shower 的实现类型(如 Demo,Demo2)有关,因此他应该是一个属于 package show 的方法:
|
|
我们说 interface wrapper function 的第二种用法,即接受 interface 类型参数,并返回与其参数类型相同的返回值。
|
|
ShowNTimes 是一个 wrapper function,它在 s 的外面再包裹上 ShowMultiTimes。通过 wrapper function 将 NewShow 和 ShowMultiTimes 的两者巧妙的组合在了一起。这样当我们采用包装后的 Shower 去 Read 时,输出的是经过处理后的字符串了。
|
|
可以看到,interface warp function 可以组合成一个 chain,因为其 wrapper function 返回值类型与 parameter 类型相同。
文章作者 gorpher
上次更新 2019-03-12