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

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

内容简介:什么是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类型相同。


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

查看所有标签

猜你喜欢:

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

Building Websites with Joomla!

Building Websites with Joomla!

H Graf / Packt Publishing / 2006-01-20 / USD 44.99

This book is a fast paced tutorial to creating a website using Joomla!. If you've never used Joomla!, or even any web content management system before, then this book will walk you through each step i......一起来看看 《Building Websites with Joomla!》 这本书的介绍吧!

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

在线XML、JSON转换工具

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

RGB CMYK 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具