在Go语言中将数组转换为切片

n1bvdmb6  于 2023-02-06  发布在  Go
关注(0)|答案(5)|浏览(174)

这似乎是一个相当普遍的事情,在互联网上有大量的例子,但我似乎找不到一个如何将[32]byte转换为[]byte的例子。
我有一个从外部库调用的函数,它返回一个数组

func Foo() [32]byte {...}

然后,我需要将结果传递给另一个函数以进行进一步处理。

func Bar(b []byte) { ... }

不幸的是如果我打电话

d := Foo()
Bar(d)

我得到

cannot convert d (type [32]byte) to type []byte

[]byte(d)

我该怎么做呢,尤其是在不创建数据副本的情况下(当我所做的只是传递沿着时,复制这些数据似乎很愚蠢)。

vmpqdwk3

vmpqdwk31#

这应该行得通:

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[:])
}

并且它不会创建基础缓冲区的副本

ffscu2ro

ffscu2ro2#

arr[:]  // arr is an array; arr[:] is the slice of all elements
xqk2d5yq

xqk2d5yq3#

这就可以了:

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

还可以避免复制基础缓冲区。

roejwanj

roejwanj4#

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

var a [32]byte 
slice := a[:]

更一般地说,对于以下数组:

var my_array [LENGTH]TYPE

您可以通过编写以下内容来生成不同大小的切片:

my_array[START_SLICE:END_SLICE]

如果START_SLICE等于下限,则忽略START_SLICE;如果START_SLICE等于上限,则忽略END_SLICE,在您的情况下:

a[0:32]

生成基础数组的切片,等效于:

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

gojuced75#

假设您有一个现有的数组my_array,那么创建一个新切片并将array追加到其中

var s []string
s = append(s, my_array...)

相关问题