golang的interface
我们都知道,接口是:用来定义对象之间交互的协议的
所以我们写接口:实际上就是在“定义交互协议”
接口与依赖
如果两个类都对某个接口有依赖,那么依赖应该被抽象出来,特别的当这两个类还相互依赖,抽象出来接口,可以避免循环依赖~
go 的接口 duck type
定义并且实现接口
// 定义
type Programmer interface {
writeHelloWorld() Code
}
// 实现一个实例
type GoProgrammer struct {
// 可以定义其他成员
}
// 实现方法
// 声明一下实现的类型——绑定在某一个接口指针上(防止数据复制)
// 方法名和接口一致,
// 入参一致,返回值一致
func (p *GoProgrammer) WirteHelloWorld() Code{
return fmt.Pringln('hello world')
}
golang里完全看不出来 implements
这样的声明绑定,而是使用了duck type——实现大范围解耦
好处呢?
我们可以先定义func
,再定义接口,可以有很多方法同名,以后改接口,不需要去管 implements
- go的接口为非侵入性,实现不依赖于接口定义
- 所以接口定义可以包含在接口使用者包内
接口变量
以下代码为例:
var prog coder = &GoProgrammer{
}
接口变量prog
类型:
type GoProgrammer struct {
}
数据:
&GoProgrammer{
}
自定义类型
看如下代码:
package Interface
import (
"fmt"
"time"
)
type IntConvertionFn func(n int) int
type MyPoint int
func timeSpent(inner func(n int) int) func(n int) int {
return func(n int) int {
start := time.Now()
ret := inner(n)
fmt