Convert array to slice in Go

匿名 (未验证) 提交于 2019-12-03 02:47:02

问题:

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:

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:

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


回答3:

This will do the trick:

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

Also avoids copying the underlying buffer.



回答4:

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


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!