Срезы Go реализованы в виде структуры:
src/runtime/slice.go
:
type slice struct {
array unsafe.Pointer
len int
cap int
}
Вы назначаете / копируете структуру слайса, которая не копирует базовый массив, только его указатель.
Простая иллюстрация:
package main
import (
"fmt"
)
func main() {
buf := make([]byte, 8)
for i := range buf {
buf[i] = byte(i)
}
sub := buf[1:3]
fmt.Println(buf)
fmt.Println(sub)
for i := range sub {
sub[i] += 43
}
fmt.Println(buf)
fmt.Println(sub)
}
Детская площадка: https://play.golang.org/p/4OzPwuNmUlY
Вывод:
[0 1 2 3 4 5 6 7]
[1 2]
[0 44 45 3 4 5 6 7]
[44 45]
См. Блог Go: Go Slices: использование и внутреннее оборудование ,