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

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


温温酱
浏览 353回答 2
2回答

临摹微笑

虽然 C 的void *指针和 Go 的interface{}变量共享可以存储任意类型的属性,但有一个很大的区别:Go 接口变量还存储它们所持有的值的类型。因此,虽然希望 C 程序员确保从void *指针到特定类型的任何强制转换都是安全的,但 Go 运行时可以检查任何类型断言是否正确。在接口变量中找到的类型信息还允许通过reflect包进行复杂的运行时自省,这对于普通void *指针是不可能的。

HUWWW

我倾向于说“一点也不!”。但我承认它可能与“持有任何出现的东西”相同的目的。Aninterface {}不是指针,因此您无法取消引用它。您可以将 avoid*强制转换为任何类型,但类型断言 aninterface {}可能会导致运行时恐慌。确定 avoid*指向的实际类型很复杂(或不可能),但是包反射允许您为interface {}.所以不行!interface {}是空接口,与void*C 中的a 无关,只有一个小例外,两者都可能用于处理您不关心它的真实性质的任何事情。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go