实现接口的所有方法就隐式的实现了接口;
在Go中,接口是一组方法签名。 当类型为接口中的所有方法提供定义时,就说实现了该接口。
接口特征
- 接口只有方法声明,没有实现
- 接口可以嵌入到其他接口,或者结构体中
- 将对象赋值给接口时,会发生拷贝,而接口内部存储的是指这个复制品的指针,既无法修改复制品的状态,也无法获得指针。
- 只有当接口存储的类型和对象都为nil时,接口才等于nil
- 接口调用不会做receiver的自动转换
- 接口同样支持匿名字段方法
- 接口可实现类似面向对象中的多态
- 空接口:如果一个接口里面没有定义任何方法,那么它就是空接口,任意结构体都隐式地实现了空接口。
- 接口变量只包含两个指针字段,那么它的内存占用应该是2个指针字节长度
- 可以把拥有超集的接口转化为子集的接口。
Go语言里面有4种不同类型的函数:
- 顶级函数
- 值接受者函数
- 指针接受者函数
- 函数字面量
5种不同类型的调用:
- 直接调用顶级函数
- 直接调用值接受者函数
- 直接调用指针接受者函数
- 接口上方法的间接调用
- 函数值的间接调用
它们混合在一起,构成了功能和调用类型的10种可能的组合:
- 直接调用顶级函数/
- 直接调用带有值接收器的方法/
- 直接调用带有指针接收器的方法/
- 接口上方法的间接调用/包含值方法的值/
- 接口上的方法的间接调用/包含带有值方法的指针
- 接口上的方法的间接调用/包含带有指针方法的指针
- 间接调用func值/设置为顶级func
- 间接调用func值/设置为value方法
- 间接调用func值/设置为指针方法
- 间接调用func值/设置为字面量func
断言
- 空接口.(具体类型) ```go var e interface {}
f,_ := os.Open(“a.txt”)
e = f
r, ok := e.(“os.File”)
ok 为true ok 为false时,r被赋值为动态类型的零值
- 非空接口.(具体类型)
```go
var rw io.ReadWriter
r,ok := rw.(*os.File)
ok 为 true
r被赋值为rw的动态值
- 空接口.(非空接口)
var e interface {}
f, _ := os.Open("a.txt")
e = f
rw,ok := e.(io.ReadWriter)
ok 为 true
- 非空接口.(非空接口)
var w io.Writer
f,_ := os.Open("a.txt")
w = f
rw, ok := w.(io.ReaderWriter)
ok 为true