英文:
golang interface compliance compile type check
问题
我从camlistore(http://code.google.com/p/camlistore/source/browse/pkg/cacher/cacher.go)中看到以下语句。
var (
_ blobref.StreamingFetcher = (*CachingFetcher)(nil)
_ blobref.SeekFetcher = (*CachingFetcher)(nil)
_ blobref.StreamingFetcher = (*DiskCache)(nil)
_ blobref.SeekFetcher = (*DiskCache)(nil)
)
我理解这些语句没有创建变量,而是确保编译器检查CachingFetcher是否实现了StreamingFetcher和SeekFetcher的公共函数。RHS部分使用了一个带有nil参数的指针构造语法。在Go语言中,这种语法表示什么意思?
英文:
I see the following statements from camlistore(http://code.google.com/p/camlistore/source/browse/pkg/cacher/cacher.go).
var (
_ blobref.StreamingFetcher = (*CachingFetcher)(nil)
_ blobref.SeekFetcher = (*CachingFetcher)(nil)
_ blobref.StreamingFetcher = (*DiskCache)(nil)
_ blobref.SeekFetcher = (*DiskCache)(nil)
)
I understand that no variables are created and the statements ensure compiler checks that CachingFether implements public functions of StreamingFetcher and SeekFetcher. RHS portion uses a pointer constructor syntax with a nil parameter. What does this syntax mean in Go language ?
答案1
得分: 18
(*T)(nil)
是一个转换。在这种情况下,它代表一个有类型的nil,即在赋值之前与例如
var p *T
相同的值。
转换的标准语法是T(expr)
,但是*
的优先级会导致它在
*T(expr)
中被错误地绑定。这个语法表示对函数T
的返回值进行解引用,参数为expr
。这就是为什么转换有一种替代语法的原因:
(T)(expr)
其中T
当然可以是*U
。因此
(*U)(expr)
是你在Camlistore存储库中看到的形式的广义形式。
英文:
(*T)(nil)
is a Conversion. In this case it stands for a typed nil, ie. the same value which, for example
var p *T
has before assigning anything to it.
The standard syntax of a conversion is T(expr)
, but the priority of the *
would bind it wrongly in
*T(expr)
This syntax means dereferencing the return value of function T
with one argument expr
. That's why the conversion has an alternative syntax:
(T)(expr)
where T
can of course be *U
. Therefore
(*U)(expr)
is the generalized form of what you see in the Camlistore repository.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论