golang源代码为什么用这种方式编写

xren:

我看到了一些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

Himanshu:

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

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

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

而第二行检查*StoreBlockedErr实现errcode.ErrorCode

您可以要求编译器通过尝试使用T的零值或指向T的指针进行赋值来检查类型T是否实现了接口I:

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() {}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么用这种方式处理成员函数?

为什么用这种方式包装JavaScript

为什么用这种方式计算位图大小?

朱莉娅为什么用这种复杂的方式表达这种表达?

为什么用python编写的决策树代码与R编写的代码预测不同?

为什么用这种方式计算rsa密钥size_in_bytes

为什么用这种方式设计Java 8“ Collector”类?

为什么用这种方式将STDERR重定向到/ dev / null?

(这与比较字符串无关)为什么用这种方式打印?

为什么用这种方式更新UITableView的单元格是错误的?

为什么用Golang编写的某些函数运行起来比用Java还要慢?

为什么用Scala编写的代码比Java慢6倍?

为什么用 TypeScript 泛型编写的这段代码不正确?

为什么用C ++代码编写的纯URI起作用?

为什么useReducer以这种方式设置?感觉像是在向后编写代码?

我对此代码的分析是否正确,为什么要用这种方式编写?

为什么用Angular ActivatedRoute会发生这种情况?

为什么在C ++标准中以这种方式编写声明声明?

用Python编写源代码

为什么用grep -q退出代码141?

为什么用此代码(drawRect)渲染2行?

为什么golang bytes.Buffer会以这种方式运行?

为什么用vim打开go build的二进制文件,我可以看到一些源代码库信息?

exec.c内核源代码中的空函数声明有什么用?

为什么用户必须编译源代码才能在Linux上安装应用程序?

为什么用laravel livewire图片上传时出现这种奇怪的行为

为什么根据代码的编写方式更改事件参数

用opencv编写gstreamer源代码

为什么用Python编写后文件中没有显示数据