Подтвердить что ты не робот

Преобразование массива в срез в Go

Похоже, что это было бы довольно распространенным явлением и богатыми примерами в interwebs, но я не могу найти пример того, как преобразовать [32]byte в []byte.

У меня есть функция, которую я вызываю из внешней библиотеки lib, которая возвращает массив

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

Затем мне нужно передать этот результат другой функции для дальнейшей обработки.

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

К сожалению, если я попытаюсь позвонить

d := Foo()
Bar(d)

Я получаю

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

Выполнение

[]byte(d)

не намного лучше. Как это сделать, особенно без создания копии данных (кажется, глупо копировать эти данные, когда все, что я делаю, это передать это).

4b9b3361

Ответ 1

Это должно работать:

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

И он не создает копию базового буфера

Ответ 2

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

Ответ 3

Это сделает трюк:

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

Также избегает копирования базового буфера.