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)