由于类型为interface{}
的变量可以拥有任何值,这是否意味着它本质上像C语言中的void*那样是一个通用指针?
虽然C语言的void *
指针和Go语言的interface{}
变量都具有存储任意类型数据的属性,但它们之间存在一个重要的区别:Go语言的接口变量还存储所持有值的类型。
因此,虽然C语言程序员需要确保从void *
指针强制转换到特定类型时是安全的,但Go语言运行时可以检查任何类型断言是否正确。
接口变量中的类型信息还允许通过reflect
包进行复杂的运行时内省,而使用普通的void *
指针则无法实现这一点。
interface{}
就像是带有 void*
和额外类型数据的 struct
。 - Brenden我倾向于说“完全不是!”但我承认它可能达到“持有任何东西”的目的。
interface{}
不是指针,因此无法对其进行解引用。void*
转换为任何类型,但类型断言interface{}
可能会导致运行时崩溃。void*
指向的实际类型很复杂(或不可能),但包反射可让您对interface{}
执行此操作。所以不!interface{}
是空接口,与C中的void*
没有任何关系,只有一个小例外:两者都可以用于处理您不关心其真实性质的任何内容。
interface{}
也可以包含原始类型,而 void *
指向某个东西(除非你非常不整洁,但不能保证所有 C 的原始类型都可以无损地转换为 void *
)。 - Nick Craig-Woodinterface{}
是一个void*
,但是void*
不是一个interface{}
(因为接口除了指针还有其他功能)。这样说是否公平? - Brenden
interface{}
不像C语言中的“通用指针void *”。 - kostixinterface{}
作为其他类型的通用容器的基本功能。 - Brenden