栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

该相关转到FAQ中指出,

[]T
[]interface{}
«别在内存相同的表示»。

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

  1. 切片是一个后备存储阵列,外加几个包含切片大小和容量的整数。

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

这意味着,在切片的支持数组中

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

这意味着,片的每个元素

[]int
在64位平台上恰好占用64位(8字节),即单个
int
值占用的内存量。

  1. 任何接口类型的值(包括空接口
    interface{}
    )都表示为包含两个指针的结构,如下所示:
    type iface struct {realType  *typeInforealValue *dataType

    }

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

以上所有方法均意味着一个

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

反过来,这意味着您不能仅仅“投射”

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

最后,这意味着如果一个函数返回一个type的slice

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



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/368195.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号