将数组转换为切片在Go中的写法是:

huangapple go评论71阅读模式
英文:

Convert array to slice in Go

问题

这似乎是一个相当常见的问题,在互联网上有很多示例,但我似乎找不到将[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)也不太好。我该如何做到这一点,尤其是在不创建数据副本的情况下(当我只是传递数据时,复制数据似乎很愚蠢)?

英文:

This seems like it would be a fairly common thing and abundant examples across the interwebs, but I can't seem to find an example of how to convert an [32]byte to []byte.

I have a function that I call from an external lib that returns an array

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

I then need to pass that result to a different function for further processing.

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

Unforunately, if I try to call

d := Foo()
Bar(d)

I get

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

Doing

[]byte(d)

isn't much better. How do I do this, especially without creating a copy of the data (seems silly to copy this data when all I'm doing is passing it along).

答案1

得分: 144

这应该可以工作:

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

而且它不会创建底层缓冲区的副本。

英文:

This should work:

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

And it doesn't create a copy of the underlying buffer

答案2

得分: 101

arr[:] // arr是一个数组;arr[:]是所有元素的切片

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

答案3

得分: 14

这样就可以了:

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

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

英文:

This will do the trick:

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

Also avoids copying the underlying buffer.

答案4

得分: 9

你可以使用:来按照数组的边界对数组进行切片:

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

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

var my_array [LENGTH]TYPE

你可以通过以下方式生成不同大小的切片:

my_array[START_SLICE:END_SLICE]

如果START_SLICE等于低边界,则省略START_SLICE;如果END_SLICE等于高边界,则省略END_SLICE。在你的情况下:

a[0:32] 

生成底层数组的切片,等同于:

a[0:]
a[:32]
a[:]
英文:

You can generally slice an array by its bounds with : :

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

More generally, for the following array :

var my_array [LENGTH]TYPE

You can produce the slice of different sizes by writing :

my_array[START_SLICE:END_SLICE]

Omitting START_SLICE if it equals to the low bound and END_SLICE if equals to the high bound, in your case :

a[0:32] 

Produces the slice of the underlying array and is equivalent to :

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

答案5

得分: 0

如果你有一个现有的数组my_array,想要创建一个新的切片并将数组添加到其中,可以按照以下方式操作:

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

这样就可以将my_array的元素追加到切片s中了。

英文:

Say, if you have an existing array my_array, create a new slice and append array to it

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

huangapple
  • 本文由 发表于 2015年3月6日 03:59:29
  • 转载请务必保留本文链接:https://go.coder-hub.com/28886616.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定