您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

我为什么不能在go中传递`func()[] int`作为`func()[] interface {}`?

我为什么不能在go中传递`func()[] int`作为`func()[] interface {}`?

相关转到FAQ中指出,[]T[]interface{}«别在内存相同的表示»。

要了解原因,让我们剖析两件事:

在Go中,数组并不是某种意义上的“高级”。相反,它们包含的元素的布局是严格定义的:它们全部包含在内存的相邻区域中,彼此相邻。

这意味着,在切片的支持数组中[]T,元素是类型的T,并且每个元素都占据该类型自然大小的内存区域T,并且所有这些区域在单个连续的内存块中都彼此相邻。

这意味着,片的每个元素[]int在64位平台上恰好占用64位(8字节),即单个int值占用的内存量。

type iface struct {
realType  *typeInfo
realValue *dataType

}

(有关接口表示方式的更多信息- 此处)。

以上所有方法均意味着一个[]interface{}元素中的每个元素在内存区域中占据两个指针的大小,并且这两个指针包含内存中其他变量的地址- 与元素仅包含的整数值相反[]int

反过来,这意味着您不能仅仅“投射” []int到“[]interface{}—”仅是因为[]intint)的任何元素中存储的值在其结构(内存布局)中与[]interface{}一个包含两个指针的结构)不兼容。)。为了彼此产生,您需要分配一个切片并将源切片的每个元素转换为目标切片的匹配元素。

最后,这意味着如果一个函数返回一个type的slice[]int,则该代码不能由期望该类型的slice的代码直接处理[]interface{}(反之亦然),这解释了为什么问题中的两个函数签名表示不兼容的类型。

Go 2022/1/1 18:17:40 有410人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶