定义交互协议
接口是用来定义对象之间的交互协议的。
Go 语言中,接口的实现,是不依赖其定义的,
Duck Type 式接口实现
接口实现
type Programmer interface {
WriteHelloWorld() string
}
接口实现
type GoProgrammer struct {}
func (p *GoProgrammer) WriteHelloWorld() string {
return "fmt.Println(\"Hello World!\")"
}
GoProgrammer
实现 Programmer
这个接口,但是没有显式的使用 implements
这样的关键字去将这两者绑定在一起,而是使用了 Duck Type
这样的方式。
所谓 Duck Type
,脚上有噗,翅膀有毛,嘴是扁的,也不知道具体是什么鸟,看起来像是鸭子,我们就叫它鸭子。
对应到代码中,方法签名式一样的,我们就认为它式它的实现类。
Go 接口
与其他主要编程语言的差异
- 接口为非入侵,实现不依赖于接口定义
- 所有接口的定义可以包含在接口使用者包内
接口变量
Coder
是接口变量,``GoProgrammer是它的实现,
prog就是一个变量。当
prog被初始化之后分为两部分,第一部分是类型,第二部分是数据,真正实现
Go Programmer` 的实例。
自定义类型
1. type IntConvertionFn func(n int) int
2. type MyPoint int
测试实例 1
对 5.1 节中的 timeSpend
函数进行优化
type IntConv func(op int) int
func timeSpend(inner IntConv) IntConv {
return func(n int) int {
start := time.Now()
ret := inner(n)
fmt.Println("time spend:", time.Since(start).Seconds())
return ret
}
}
func slowFun(op int) int {
time.Sleep(time.Second * 1)
return op
}
func TestFn(t *testing.T) {
tsSF := timeSpend(slowFun)
t.Log(tsSF(10))
}