Go语言接口为隐式实现,意味着开发者无需声明接口实现。当然这种设计的优势非常明显,但我们可能需要显示检查是否实现了某接口。最好的方面依赖编译器实现,确保在编码阶段就能消除问题。
问题说明
请看下面代码:
package main
type Jedi interface {
HasForce() bool
}
type Knight struct {}
func main() {}
编译上述代码没有问题,但我们希望强制Knight类型实现Jedi接口。当然可以通过编写测试实现,但更好的方法是在编译阶段就能确保接口被实现:
package main
type Jedi interface {
HasForce() bool
}
type Knight struct {
}
var _ Jedi = (*Knight)(nil)
func main() {
}
编译代码当然会报错:
cannot use (*Knight)(nil) (type *Knight) as type Jedi in assignment:
*Knight does not implement Jedi (missing HasForce method)
问题出在 var _ Jedi = (*Knight)(nil)
。我们声明变量_
,表明不关系变量本身,也不关心其值,仅声明Jedi类型。等式右边首先是类型转换,nil
类型转换为*Knight
类型并赋值,要能编译通过,Jedi必须实现相应的接口方法,否则会编译错误。
通过实现HasForce方法,编译通过。
package main
type Jedi interface {
HasForce() bool
}
type Knight struct {
}
func (k *Knight) HasForce() bool {
return true
}
var _ Jedi = (*Knight)(nil)
func main() {
}
当然也可以直接new对象:var _ Jedi = new(Knight)
.