Golang强制类型实现接口

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).

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值