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

Bre*_*den 15 c types go

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

Jam*_*dge 20

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

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

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

  • 所以`interface {}`就像一个带有`void*`和其他类型数据的`struct` (2认同)

Vol*_*ker 6

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

  1. An interface {}不是指针,因此您无法取消引用它.
  2. 您可以将a转换void*为任何类型,但类型断言interface {}可能会导致运行时混乱.
  3. 确定void*点的实际类型是复杂的(或不可能的)但是包反射允许你这样做interface {}.

所以不行!interface {}是一个空接口,与void*C中的一个没有任何关系,只有很小的例外,它们可能用于处理你不关心它的真实性质的任何事情.