Преобразование массива в срез в 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)
не намного лучше. Как это сделать, особенно без создания копии данных (кажется, глупо копировать эти данные, когда все, что я делаю, это передать это).
Ответы
Ответ 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)]
Также избегает копирования базового буфера.