8

我从 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)
)

我知道没有创建任何变量,并且这些语句确保编译器检查 CachingFether 是否实现了 StreamingFetcher 和 SeekFetcher 的公共函数。RHS 部分使用带有 nil 参数的指针构造函数语法。这种语法在 Go 语言中是什么意思?

4

1 回答 1

13

(*T)(nil)是一个转换。在这种情况下,它代表一个类型化的 nil,即。相同的值,例如

var p *T

在给它分配任何东西之前。

转换的标准语法是T(expr),但是 的优先级*会错误地将其绑定在

*T(expr)

T这种语法意味着用一个参数取消引用函数的返回值expr。这就是转换具有替代语法的原因:

(T)(expr)

T当然可以在哪里*U。所以

(*U)(expr)

是您在 Camlistore 存储库中看到的通用形式。

于 2013-08-01T12:50:49.650 回答