Golang的水平组合思维(1)——interface wrapper function

栏目: Go · 发布时间: 5年前

内容简介:什么是Golang的正交组合-水平组合思维:这篇文章研究其中提到的 interface wrapper function。这是一个最简单的,定义了一个Shower的接口并声明了Show方法,满足这个接口的类型

什么是Golang的正交组合-水平组合思维: Tony Bai的博客 - Coding in GO way - Orthogonal Composition

这篇文章研究其中提到的 interface wrapper function。

//show/show.go
package show
type Shower interface {
    Show()
}

这是一个最简单的,定义了一个Shower的接口并声明了Show方法,满足这个接口的类型 Type.Show() 将在屏幕显示用户定义的一段文字。

随后我们需要为这个Shower接口添加一个实例。例如我们添加一个数据类型使他能够显示 Demo: user-string

//demo/demo.go
package demo
type Show struct {
    s string
}
func (this *Show) Show(){
    fmt.Println("Demo:",this.s)
}

这段代码是否应该属于 package show ?不是,因为实现Show()方法不止这一种。例如我们还可以:

//demo2/demo.go
package demo2
type Show struct {
    s string
}
func (this *Show) Show(){
    fmt.Println("This is another Demo: ",this.s)
}

接下来我们可以在main.go中使用这个接口和对应的方法:

//main.go
package main
import(
    "show"
    "demo"
    "demo2"
)
func main(){
    var ds show.Shower = &demo.Show{"string from main"}
    var d2s show.Shower = &demo2.Show{"string from main"}
    ds.Show()
}

我们一般用一个函数来包装参数,使之直接返回一个接口类型。这是interface warp function的其中一种用法:

//demo/demo.go
func NewShow(s string) show.Shower {return &Show{s}}
//demo.Show不是Shower接口的实现类型,*demo.Show才是

在main.go中使用这个方法来创建接口:

//main.go
ds := demo.NewShow("string from main")
ds.Show()

注意在写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:

//which package does it belong??
type ShowMutliTimes_s struct {
    n int  //n times
}
func (this *ShowMultiTimes_s) Show(){
    for i:=0;i<this.n;i++{
        //??
    }
}

可以发现,这个方法应该同时对所有Shower的实现类型生效。同时他打印的内容也与Shower的实现类型(如Demo,Demo2)有关,因此他应该是一个属于package show的方法:

package show
import "fmt"

type ShowMultiTimes struct {
    S Shower
    n int
}
func (this *ShowMultiTimes) Show(){
    for i:=0;i<this.n;i++{
        fmt.Print("Time",i,": ")
        this.S.Show()
    }
}

我们说interface wrapper function的第二种用法,即接受interface类型参数,并返回与其参数类型相同的返回值。

func ShowNTimes(s Shower, n int) Shower {return &ShowMultiTimes{s,n}}

ShowNTimes是一个wrapper function,它在s的外面再包裹上ShowMultiTimes。通过wrapper function将NewShow和ShowMultiTimes 的两者巧妙的组合在了一起。这样当我们采用包装后的Shower去Read时,输出的是经过处理后的字符串了。

//main.go
package main
import(
    "show"
    "demo"
    "demo2"
)
func main(){
    st:=show.ShowNTimes(test.NewShowI("String from main"),3)
    st.Show()
}

可以看到,interface warp function可以组合成一个chain,因为其wrapper function返回值类型与parameter类型相同。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

众媒时代

众媒时代

腾讯传媒研究 / 中信出版集团股份有限公司 / 2016-3-1 / CNY 52.00

众媒时代,就是一个大众参与的媒体时代。互联网将传统媒体垄断而单一的传播方式彻底颠覆。人人都可以通过互联网成为内容的制造者、传播者。每个人都是媒体,人是种子,媒体变成了土壤。 当我们的信息入口被朋友圈霸占,当我们的眼睛只看得到10W+,当我们不可抑制地沉浸在一次次的“技术狂欢”中,当人人都可以举起手机直播突发现场,当未来的头条由机器人说了算……内容正生生不息地以各种可能的形式出现,我们正彻头彻......一起来看看 《众媒时代》 这本书的介绍吧!

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具