当前位置: 首页 > 面试题库 >

golang接口符合性编译类型检查

越嘉石
2023-03-14
问题内容

我从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可以是任意可以关闭的值,例如一