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

打开切片切片

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

打开切片切片

规范中对此进行了介绍:将参数传递给…
parameters

如果

f
为带有最终
p
类型为type的可变参数
...T
,则
f
类型内
p
等于type
[]T

如果最终参数可分配给切片类型

[]T
...T
则在参数后跟时可以将其作为参数的值原样传递
...
在这种情况下,不会创建新的切片。

因此,在短期:
这是一个编译时错误,因为

sliceOfSlices
(这是类型的
[][]interface{}
)不能被分配到
args
(这是类型
[]interface{}
)(上游乐场证明)。

总而言之:

在第一个示例中,当您执行时

unpack(slice)
,由于
unpack()
期望的值
interface{}
,因此
slice
(类型为
[]interface{}
)将被包装为
interface{}
值,并将其作为 单个 参数传递。

完成后

unpack(slice...)
,这会将所有的值
slice
作为单独的值传递给
unpack()
;;
这是可能的,因为的类型
slice
[]interface{}
,它与可变参数(
args ...interface{}
)的类型匹配。

在第二个示例中,当您执行

unpack(sliceOfSlices)
时,
sliceOfSlices
将再次包装在
interface{}
值中并作为 单个 参数传递。

但是,当您尝试

unpack(sliceOfSlices...)
时,可能希望将的每个元素传递
sliceOfSlices
unpack()
,但
sliceOfSlices
[][]interface{}
的类型)与可变参数的类型不匹配,因此会产生编译时错误。

传递

sliceOfSlices
unpack()
“爆炸”
的唯一方法是创建一个新切片,其类型必须为
[]interface{}
,复制元素,然后可以使用传递它
...

例:

var sliceOfSlices2 []interface{}for _, v := range sliceOfSlices {    sliceOfSlices2 = append(sliceOfSlices2, v)}unpack(sliceOfSlices2...)

在Go Playground上尝试一下。

让我们使用以下

unpack()
函数来验证参数数量:

func unpack(args ...interface{}) {    fmt.Println(len(args))}

运行您的示例(以及我的新切片创建),输出为:

1312

事实证明,

...
不仅传递了一个参数(用包裹
interface{}
),而且使用
...
所有元素都将分别传递。

在Go Playground上尝试此测试。



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

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

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