见一段代码:
type ITest interface {
TestMethod()
}
type T1 struct {
}
func (t *T1) TestMethod() {
}
type T2 struct {
}
func (t *T2) TestMethod() {
}
var _ ITest = (*T1)(nil)
var _ ITest = (*T2)(nil)
如上代码定义了ITest接口,有*T1和*T2 两个类型实现了该接口,可以看到有一段特殊代码(如下):
var _ ITest = (*T1)(nil)
var _ ITest = (*T2)(nil)
这段代码的作用是啥?
类型断言:为了检查*T1和T2两个类型是否是ITest接口的实现,若不是,则编译会报错。
为啥要这样做呢?
想象一个场景:
你开发了一段业务代码,这段代码依赖*T1和*T2必须是ITest的实现,否则代码运行就会报错。后续业务迭代过程中,小A修改了其他代码导致*T1和*T2不是ITest的实现,然后测试时也没测到这块业务代码就发布到生产环境了(因为这块业务代码是你写的,所以小A并不清楚影响),最终只有等用户使用时走到了这块业务代码才能暴露出小A修改出的问题。
在上述场景中,若有类型断言,则问题在编译期间就能暴露,而不是在运行时才暴露。
总之,就是利用编译提前暴露问题,而不是把问题留在运行时暴露(比如:代码发布到生产环境了,用户用的过程中才暴露出问题,这样问题就很严重了)。