Convert array to slice in Go

Go

Go Problem Overview


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).

Go Solutions


Solution 1 - Go

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

Solution 2 - Go

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

Solution 3 - Go

This will do the trick:

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

Also avoids copying the underlying buffer.

Solution 4 - Go

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionFuriousGeorgeView Question on Stackoverflow
Solution 1 - GoNot_a_GolferView Answer on Stackoverflow
Solution 2 - GojameshfisherView Answer on Stackoverflow
Solution 3 - GobowskyView Answer on Stackoverflow
Solution 4 - GoIsmail HView Answer on Stackoverflow