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

我有一个元素数组/切片(在我的示例中为字节),我想使用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


宝慕林4294392
浏览 92回答 1
1回答

白衣染霜花

可变参数作为切片传递。在下面的: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 语言不会执行开销很大的隐式转换。如果你需要这样做,那么你必须自己明确地做到这一点。
打开App,查看更多内容
随时随地看视频慕课网APP