英文:
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...)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论