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)_nil*Knight
通过实现HasForce方法,编译通过。
package main
type Jedi interface {
HasForce() bool
}
type Knight struct {
}
func (k *Knight) HasForce() bool {
return true
}
var _ Jedi = (*Knight)(nil)
func main() {
}
var _ Jedi = new(Knight)