【Golang】接口类型检查(或类型断言)

91 阅读1分钟

见一段代码:

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)

这段代码的作用是啥?
类型断言:为了检查*T1T2两个类型是否是ITest接口的实现,若不是,则编译会报错

为啥要这样做呢?
想象一个场景:
你开发了一段业务代码,这段代码依赖*T1*T2必须是ITest的实现,否则代码运行就会报错。后续业务迭代过程中,小A修改了其他代码导致*T1*T2不是ITest的实现,然后测试时也没测到这块业务代码就发布到生产环境了(因为这块业务代码是你写的,所以小A并不清楚影响),最终只有等用户使用时走到了这块业务代码才能暴露出小A修改出的问题。

在上述场景中,若有类型断言,则问题在编译期间就能暴露,而不是在运行时才暴露。

总之,就是利用编译提前暴露问题,而不是把问题留在运行时暴露(比如:代码发布到生产环境了,用户用的过程中才暴露出问题,这样问题就很严重了)。