在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[:]