【问题标题】:Is Go's interface{} the same as void* in C?Go 的 interface{} 和 C 中的 void* 一样吗?
【发布时间】:2013-12-02 17:10:57
【问题描述】:

既然interface{} 类型的变量可以有任何值,这是否意味着它本质上是一个像C 中的void* 一样的通用指针?

【问题讨论】:

  • @kostix 感谢您的链接,但这说明 golang 规范没有?
  • 它解释了实现,它清楚地遵循 interface{} 不是“像 C 中的 void * 这样的通用指针”。
  • @kostix 我对底层功能以及 Go 如何使 interface{} 成为其他类型的通用容器更加好奇。
  • 也许已经很晚了,但我真的很喜欢你的问题。 :)

标签: c types go


【解决方案1】:

虽然 C 的 void * 指针和 Go 的 interface{} 变量共享可以存储任意类型的属性,但有一个很大的区别:Go 接口变量也存储它们所持有的值的类型。

因此,尽管 C 程序员应确保从 void * 指针到特定类型的任何强制转换都是安全的,但 Go 运行时可以检查任何类型断言是否正确。

在接口变量中找到的类型信息还允许通过 reflect 包进行复杂的运行时自省,这对于普通的 void * 指针是不可能的。

【讨论】:

  • 所以interface{} 就像struct 带有void* 和其他类型数据
  • 是的。类型信息还用于决定如何在非空接口类型上调度方法调用。
【解决方案2】:

我倾向于说“一点也不!”。但我承认,它可能服务于“抓住任何发生的一切”的相同目的。

  1. interface {} 不是指针,因此您不能取消引用它。
  2. 您可以将 void* 强制转换为任何内容,但类型断言 interface {} 可能会导致运行时恐慌。
  3. 确定void* 指向的实际类型很复杂(或不可能),但包反射允许您为interface {} 执行此操作。

所以不! interface {} 是空接口,与 C 语言中的 void* 无关,只是两者都可能用于处理您不关心其真实性质的任何事情。

【讨论】:

  • 你可能想说interface{} 也可以保存原始类型,而void * 指向一些东西(除非你真的很不整洁,但不能保证全部C 的原始类型可以无损地转换为 void *)
  • 我认为它是那些方形/矩形的东西之一。 interface{}void*,但 void* 不是 interface{}(因为接口不仅仅是一个指针。这样说公平吗?
  • @Brenden:不,我看不出有什么理由解释这样的空界面。所有这些“用语言 Y 构造 X 就像 Z 和语言 U 一样”并不总是有帮助。
  • @Volker 将未知概念与熟悉的概念联系起来很有帮助。
猜你喜欢
  • 2014-03-10
  • 2013-06-26
  • 2012-02-18
  • 1970-01-01
  • 2010-09-08
  • 1970-01-01
  • 2017-04-10
  • 1970-01-01
相关资源
最近更新 更多