Массивы - это значения ... срезы больше похожи на указатели.То есть [n]type
не совместимо с []type
, поскольку это принципиально две разные вещи.Вы можете получить фрагмент, который указывает на массив, используя arr[:]
, который возвращает фрагмент, имеющий arr
в качестве резервного хранилища.
Один из способов преобразования фрагмента, например []byte
в [20]byte
, - это фактически выделить [20]byte
, что вы можете сделать, используя var [20]byte
(так как это значение ... нет make
необходимо), а затем скопируйте в него данные:
buf := make([]byte, 10)
var arr [10]byte
copy(arr[:], buf)
По сути, многие другие ответы ошибаются в том, что []type
НЕ является массивом.
[n]T
и []T
- это совершенно разные вещи!
При использовании отражения []T
не является массивом Array, но имеет вид Slice, а [n]T
вид массива.
Вы также не можете использовать map[[]byte]T
, но вы можете использовать map[[n]byte]T
.
Это иногда может быть громоздким, потому что многие функции работают, например, на []byte
, тогда как некоторые функции возвращают [n]byte
(в особенности хеш-функции в crypto/*
).Например, хэш sha256 равен [32]byte
, а не []byte
, поэтому, когда новички пытаются записать его в файл, например:
sum := sha256.Sum256(data)
w.Write(sum)
, они получат ошибку.Правильный способ - использовать
w.Write(sum[:])
Однако что вы хотите?Просто доступ к строке байтово?Вы можете легко преобразовать string
в []byte
, используя:
bytes := []byte(str)
, но это не массив, а фрагмент.Также byte
! = rune
.Если вы хотите оперировать «персонажами», вам нужно использовать rune
... не byte
.