在Go中将数组转换为切片

在Go中将数组转换为切片,go,Go,这似乎是一件相当普遍的事情,在互联网上有大量的例子,但我似乎找不到一个如何将[32]字节转换为[]字节的例子 我有一个从返回数组的外部库调用的函数 func Foo() [32]byte {...} 然后,我需要将该结果传递给另一个函数进行进一步处理 func Bar(b []byte) { ... } 不幸的是,如果我想打电话 d := Foo() Bar(d) 我明白了 做 情况也好不到哪里去。如何做到这一点,尤其是在不创建数据副本的情况下(当我所做的只是传递数据时,复制数据似乎很愚蠢

这似乎是一件相当普遍的事情,在互联网上有大量的例子,但我似乎找不到一个如何将
[32]字节
转换为
[]字节
的例子

我有一个从返回数组的外部库调用的函数

func Foo() [32]byte {...}
然后,我需要将该结果传递给另一个函数进行进一步处理

func Bar(b []byte) { ... }
不幸的是,如果我想打电话

d := Foo()
Bar(d)
我明白了

情况也好不到哪里去。如何做到这一点,尤其是在不创建数据副本的情况下(当我所做的只是传递数据时,复制数据似乎很愚蠢)。

这应该可以:

func Foo() [32]byte {
    return [32]byte{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}
}

func Bar(b []byte) {
    fmt.Println(string(b))
}

func main() {
    x := Foo()
    Bar(x[:])
}

而且它不会创建底层缓冲区的副本,这将实现以下功能:

slice := array[0:len(array)]

还可以避免复制底层缓冲区。

通常可以使用
:按数组边界对数组进行切片:

arr[:]  // arr is an array; arr[:] is the slice of all elements
var a [32]byte 
slice := a[:]
更一般地说,对于以下阵列:

var my_array [LENGTH]TYPE
您可以通过写入以下内容来生成不同大小的切片:

my_array[START_SLICE:END_SLICE]
如果它等于下限,则省略
START\u SLICE
;如果它等于上限,则省略
END\u SLICE
,在您的情况下:

a[0:32] 
生成基础数组的切片,等效于:

a[0:]
a[:32]
a[:]

请参见下限为0的默认值。上限的默认值是
len(x)
x[0:len(x)]最好写为
x[:]
。这正是现有答案所说的。考虑到解决方案的有效性,我发现向下投票的数量有点苛刻……虽然OP只是希望对底层数组进行完全转换,但知道指定下限和上限与切片注释相同是很有用的。例如,您可能希望分配一个数组(而不是使用makeslice),然后使用下限/上限表示法设置数组的部分。示例:是否有可能获得一个像
Bar(Foo()[:])
这样的一行程序工作?@BluBb_没有。片基本上是下面的一个结构,其底层引用是:一个缓冲区;它的长度;以及它的能力。要初始化一个片的缓冲区,需要来自堆而不是堆栈(存储返回值的堆栈)的可寻址内存,因为堆栈内存在其功能之外不是持久性的。这和我们不能做这样的事情的原因是一样的。哦,好吧,为什么这些事情总是那么合乎逻辑。
a[0:32] 
a[0:]
a[:32]
a[:]