在Go中将数组转换为切片

时间:2015-03-05 19:59:29

标签: go

这似乎是一个相当普遍的事情和跨越互联网的大量示例,但我似乎无法找到如何将[32]byte转换为[]byte的示例。< / p>

我有一个函数,我从外部lib调用它返回一个数组

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

然后我需要将该结果传递给不同的函数以进行进一步处理。

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

不幸的是,如果我试着打电话

d := Foo()
Bar(d)

我得到了

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

否则

[]byte(d)

不是更好。我该怎么做,特别是在没有创建数据副本的情况下(当我正在做的所有内容传递时,复制这些数据似乎很愚蠢。)

4 个答案:

答案 0 :(得分:75)

这应该有效:

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

它并没有创建底层缓冲区的副本

答案 1 :(得分:31)

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

答案 2 :(得分:7)

这样可以解决问题:

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

还避免复制底层缓冲区。

答案 3 :(得分:3)

您通常可以使用:

的边界对数组进行切片
var a [32]byte 
slice := a[:]

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

var my_array [LENGTH]TYPE

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

my_array[START_SLICE:END_SLICE]

省略START_SLICE如果它等于下限,END_SLICE如果等于上限,在你的情况下:

a[0:32] 

生成底层数组的切片,相当于:

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