如何判断一个类型是否实现了某个接口?
var w io.Writer = new(bytes.Buffer) // 编译器检查
var _ io.Writer = (*bytes.Buffer)nil // w可以被省略,因为不会用到,也没必要创建一个新变量,使用nil代替也满足要求
就是接口变量,如果有某个类型实现了接口,就可以将类型变量赋值给接口变量
类型断言,就是使用在接口值上的操作,x.(T) x是接口类型,T是实现接口的类型或另一个接口类型, 如果x是nil,那么会断言会失败
断言操作,如果只返回一个值,当遇到失败,会产生panic; 如果返回两个值,当遇到失败,不会产生panic,因为第二个值标识是否成功
类型断言非常有用,特别是某些在乎性能的场景。
接口有两种使用方式:
- 普通用法,关注点在方法上,而隐藏了实现和具体类型。类似c++的基类(接口类),关注的是行为 - 子类型多态
- 特殊用法,关注点在类型是否满足接口,使用类型断言来完成。没有隐藏信息 - 非参数多态
- 用法一: 类型开关 switch x := x.(type) {}
当且仅当有多个具体类型必须以相同的方式进行处理时才需要使用到接口; 如果只有一个具体类型用的接口,过多时,会造成运行时损耗。 只有一个特例场景中接口只有一个具体类型:由于依赖,导致具体类型和接口不在同一个包中,需要解耦会使用到接口。