Спецификация языка не позволяет вам «напрямую» обращаться к базовому, резервному массиву среза.Вы можете сделать это, как вы можете видеть в ответе peterSO, используя пакет unsafe
, но, как подсказывает его название: это небезопасно .
Но если вам разрешеноиспользуя / передавая свои собственные фрагменты, вы можете получить доступ к его массиву резервных копий, если вы создадите фрагмент, разрезая массив.Это не требует никакой магии, выражения среза делают именно это, если применяются к массивам: результирующий срез будет использовать операнд среза (массив) в качестве своего резервного массива.
Например:
var a [32]byte
s := a[:]
a[0] = 1
fmt.Println(a)
fmt.Println(s)
s[1] = 2
fmt.Println(a)
fmt.Println(s)
Вывод (попробуйте на Go Playground ):
[1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
a
- это массив, а s
- это срез.Изменяя элементы с помощью любого из них, «оба» будут меняться одновременно.s
имеет a
в качестве резервного массива, s
ссылки a
.