Go的接口{}与C中的void *相同吗?

时间:2013-11-19 08:32:22

标签: c types go

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

2 个答案:

答案 0 :(得分:20)

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

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

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

答案 1 :(得分:6)

我倾向于说“完全没有!”。但我承认它可能服务于“持有任何东西”的相同目的。

  1. interface {}不是指针,因此您无法取消引用它。
  2. 您可以将void*转换为任何内容,但声明interface {}的类型可能会导致运行时出现紧急情况。
  3. 确定void*指向的实际类型很复杂(或不可能),但包反射允许您为interface {}执行此操作。
  4. 所以不! interface {}是空接口,与C中的void*无关,但有一个小例外,它们可能用于处理你不关心它的真实性质的任何事情。

相关问题