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

使用“...”运算符将切片元素传递给“fmt.Println”以传播参数是行不通的。为什么?

使用“...”运算符将切片元素传递给“fmt.Println”以传播参数是行不通的。为什么?

Go
宝慕林4294392 2022-11-23 20:27:47

我有一个元素数组/切片(在我的示例中为字节),我想使用ftm.Println. 我当然可以只遍历数组中的元素并以这种方式打印它们,但我认为如果我只是使用...运算符传递元素会更好/更短。

所以我尝试了这个:

    b := []byte{1,2,3,4}
    fmt.Println(b...)

这会导致错误:

不能在 fmt.Println 的参数中使用 b([]byte 类型的变量)作为 []any 类型”

有人可以解释为什么这不起作用吗?

我假设这fmt.Println是一个可变参数函数,能够处理任意数量的任意类型的元素([]any错误消息中的 似乎表明是这种情况)。Println所以当我传递 4 个字节时似乎无法处理它,这让我有点惊讶。

事实上,当我们像这样传递这些相同的字节时,它工作得很好:

    fmt.Println(b[0], b[1], b[2], b[3])

那么为什么它在使用时不起作用b...呢?这本质上不是一回事吗(即在这两种情况下,我们所做的都是将 4 个字节作为单独的参数传递给fmt.Println


查看完整描述

1 回答

?
白衣染霜花

TA贡献1530条经验 获得超9个赞

可变参数作为切片传递。在下面的:


fmt.Println(b[0], b[1], b[2], b[3])

编译器从这四个元素创建一个切片[]any,并传递该切片。


然而,


b := []byte{1,2,3,4}

fmt.Println(b...)

尝试传递[]byte与函数签名不兼容的 a 。


这虽然有效:


b := []any{1,2,3,4}

fmt.Println(b...)

[]byte不能被替换,[]any因为字节数组在结构上不同于接口数组。因此,需要逐个元素的转换,这可能很昂贵。通常,Go 语言不会执行开销很大的隐式转换。如果你需要这样做,那么你必须自己明确地做到这一点。


查看完整回答
反对 回复 2022-11-23

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信