为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
温温酱 2021-07-09 18:00:28
由于类型变量interface{}可以有任何值,这是否意味着它本质上是一个通用指针,如 C 中的 void*?
查看完整描述

2 回答

?
临摹微笑

TA贡献1982条经验 获得超2个赞

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

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

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



查看完整回答
反对 回复 2021-07-12
?
HUWWW

TA贡献1874条经验 获得超12个赞

我倾向于说“一点也不!”。但我承认它可能与“持有任何出现的东西”相同的目的。

  1. Aninterface {}不是指针,因此您无法取消引用它。

  2. 您可以将 avoid*强制转换为任何类型,但类型断言 aninterface {}可能会导致运行时恐慌。

  3. 确定 avoid*指向的实际类型很复杂(或不可能),但是包反射允许您为interface {}.

所以不行!interface {}是空接口,与void*C 中的a 无关,只有一个小例外,两者都可能用于处理您不关心它的真实性质的任何事情。


查看完整回答
反对 回复 2021-07-12
  • 2 回答
  • 0 关注
  • 352 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号