由于类型interface{}
的变量可以有任何值,这是否意味着它本质上是一个通用指针,如C中的void *?
答案 0 :(得分:20)
虽然C的void *
指针和Go的interface{}
变量共享可存储任意类型的属性,但有一个很大的区别:Go接口变量还存储它们所持有的值的类型。
因此,虽然期望C程序员确保从void *
指针到特定类型的任何转换是安全的,但Go运行时可以检查任何类型的断言都是正确的。
在接口变量中找到的类型信息也允许通过reflect
包进行复杂的运行时内省,这对于普通的void *
指针是不可能的。
答案 1 :(得分:6)
我倾向于说“完全没有!”。但我承认它可能服务于“持有任何东西”的相同目的。
interface {}
不是指针,因此您无法取消引用它。void*
转换为任何内容,但声明interface {}
的类型可能会导致运行时出现紧急情况。void*
指向的实际类型很复杂(或不可能),但包反射允许您为interface {}
执行此操作。所以不! interface {}
是空接口,与C中的void*
无关,但有一个小例外,它们可能用于处理你不关心它的真实性质的任何事情。