我从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语言中意味着什么?
(*T)(nil)
是一个Conversion。在这种情况下,它代表类型为nil的类型。相同的值,例如
var p *T
在分配任何东西之前
转换的标准语法为T(expr)
,但是的优先级*
会在
*T(expr)
这种语法意味着T
用一个参数取消引用函数的返回值expr
。这就是为什么转换具有替代语法的原因:
(T)(expr)
T
当然可以在哪里*U
。因此
(*U)(expr)
是您在Camlistore存储库中看到的内容的通用形式。
问题内容: 当使用as函数参数类型,给定非指针类型并与之一起使用时,我在Go中遇到了一个错误。 因为一段代码值得一千个单词,所以下面是一个示例: 哪个输出: 把我的结构变成一个… 稍后再读一些内容,可以解释其中的一部分,它本身就是一种类型,而不是某种无类型的容器,它解释了,以及无法获取初始类型并返回。的事实。 从文档: 要将JSON解组为接口值,Unmarshal将其中之一存储在接口值中:[…]
问题内容: 我有这样的地图: 该映射应该包含从字符串到对象数组的映射。数组可以是不同的类型,例如或。我填充了这个数组: 但是当我尝试从中获取元素时: 它给出了一个错误: 我该如何克服? 问题答案: 您必须将interface {}显式转换为所需类型的切片才能实现。像这样的东西 https://play.golang.org/p/yZmniZwFar
问题内容: 目前我有这样的事情 main.go 还有我的工作包 和 我正在传递给NewJob的函数是在goroutine上每2秒执行一次,但是我想访问我传递的匿名结构…但是当我尝试访问时 编号 我越来越 t.Id未定义(类型interface {}是没有方法的接口) 但是打印t给我预期的结果 {1} 问题答案: 您必须先将其声明为兼容类型,然后才能访问其字段。
这个问题直接类似于使用TypeScript进行类类型检查
问题内容: 如何确保类型在编译时实现接口?这样做的典型方法是失败地分配该类型的支持接口,但是我有几种类型只能动态转换。在运行时,这会生成非常粗糙的错误消息,而没有给出针对编译时错误的更好诊断。在运行时发现我期望支持接口的类型也很不方便,实际上却不支持。 问题答案: 假设问题是关于围棋的,例如 因为顶级域名(TLD)会在编译时为您检查。
7.2. 接口类型 接口类型具体描述了一系列方法的集合,一个实现了这些方法的具体类型是这个接口类型的实例。 io.Writer类型是用的最广泛的接口之一,因为它提供了所有的类型写入bytes的抽象,包括文件类型,内存缓冲区,网络链接,HTTP客户端,压缩工具,哈希等等。io包中定义了很多其它有用的接口类型。Reader可以代表任意可以读取bytes的类型,Closer可以是任意可以关闭的值,例如一