6.2 Go 语言的相关接口
peter 627 3

定义交互协议

接口是用来定义对象之间的交互协议的。

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 接口

与其他主要编程语言的差异

  1. 接口为非入侵,实现不依赖于接口定义
  2. 所有接口的定义可以包含在接口使用者包内

接口变量

6.2 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))
}
评论区

索引目录