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

为什么我不能在Go中用一种类型的切片替代另一种类型?

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

为什么我不能在Go中用一种类型的切片替代另一种类型?

除了Go拒绝根据此处其他答案中解决的这些方差关系转换切片之外,思考一下 为什么 Go拒绝这样做是有用的,即使两种类型的内存中表示形式相同。

在您的示例中,提供

woofRunners
s 的切片作为类型的参数
[]woofer
要求对切片的元素类型进行 协变
处理
。实际上,当从切片中
读取内容时 ,由于a
woofRunner
是a
woofer
,因此您知道a中存在的每个元素
[]woofRunner
都会满足读者的需求
[]woofer

但是,在Go中,切片是参考类型。当将切片作为参数传递给函数时,将复制切片,但是在调用的函数主体中使用的副本将继续引用相同的后备数组(

append
超出其容量之前必须进行重新分配)。数组的可变视图(通常是将项目插入集合)需要对元素类型进行
逆向 处理。也就是说,当需要 插入覆盖
type元素的目的是要求函数参数时
woofRunner
,提供a是可以接受的
[]woofer

问题是函数是否要求使用slice参数

  • 从中读取(对于
    woofer
    s来说,a
    []woofRunner
    和a一样好
    []woofer
    ),
  • 向它写(对于写
    woofRunner
    s,a
    []woofer
    和a一样好
    []woofRunner
    ),
  • 或两者兼有(两者都不可以替代)。

考虑一下,如果Go确实接受协变方式的slice参数,并且有人跟随并

allWoof
进行如下更改,将会发生什么:

// Another type satisfying `woofRunner`:type wolf struct{}func (*wolf) run()  {}func (*wolf) woof() {}func allWoof(ws []woofer) {  if len(ws) > 0 {    ws[0] = &wolf{}  }}dogs := []*dog{&dog{}, &dog{}}allWoof(dogs)  // Doesn't compile, but what if it did?

即使Go愿意将a

[]*dog
视为a
[]woofer
,我们也会
*wolf
*dog
此处的数组中加上a
。某些语言通过对尝试的数组插入或覆盖进行运行时类型检查来防止此类事故发生,但是由于Go阻止了我们做到这一点,因此不需要这些额外的检查。



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

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

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