为了账号安全,请及时绑定邮箱和手机立即绑定

golang源码为什么要这样写

golang源码为什么要这样写

Go
慕妹3146593 2023-03-21 17:09:39
我看到了一些golang代码,但我不知道它是如何工作的!有人认识吗?为什么要这样写?var _ errcode.ErrorCode = (*StoreTombstonedErr)(nil) // assert implements interface var _ errcode.ErrorCode = (*StoreBlockedErr)(nil)    // assert implements interface源代码链接是https://github.com/pingcap/pd/blob/0e216a703776c51cb71f324c36b6b94c1d25b62f/server/core/errors.go#L37
查看完整描述

1 回答

?
慕的地10843

TA贡献1785条经验 获得超8个赞

这用于检查类型 T 是否实现接口 I。


var _ errcode.ErrorCode = (*StoreTombstonedErr)(nil) // assert implements interface

var _ errcode.ErrorCode = (*StoreBlockedErr)(nil) 

在上面的代码片段中,第一行检查StoreTombstonedErrimplmenetserrcode.ErrorCode


虽然第二行检查*StoreBlockedErr实现了errcode.ErrorCode.


您可以要求编译器检查类型 T 是否实现了接口 I,方法是尝试使用 T 的零值或指向 T 的指针进行赋值,视情况而定:


type T struct{}

var _ I = T{}       // Verify that T implements I.

var _ I = (*T)(nil) // Verify that *T implements I.

如果 T(或相应的 *T)没有实现 I,错误将在编译时被捕获。


如果您希望接口的用户明确声明他们实现了它,您可以将具有描述性名称的方法添加到接口的方法集中。例如:


type Fooer interface {

    Foo()

    ImplementsFooer()

}

然后一个类型必须实现 ImplementsFooer 方法才能成为 Fooer


type Bar struct{}

func (b Bar) ImplementsFooer() {}

func (b Bar) Foo() {}


查看完整回答
反对 回复 2023-03-21
  • 1 回答
  • 0 关注
  • 58 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信