我有一个元素数组/切片(在我的示例中为字节),我想使用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贡献1796条经验 获得超10个赞
可变参数作为切片传递。在下面的:
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 语言不会执行开销很大的隐式转换。如果你需要这样做,那么你必须自己明确地做到这一点。
- 1 回答
- 0 关注
- 82 浏览
添加回答
举报
0/150
提交
取消