Срезы Go реализованы в виде структуры:
src/runtime/slice.go
:
type slice struct {
array unsafe.Pointer
len int
cap int
}
Пересмотрите вашу printSlice
функцию, чтобы показать указатель на базовый массив:
package main
import "fmt"
func main() {
s := []int{2, 3, 5, 7, 11, 13}
printSlice(s)
// Drop its last two values
s = s[:len(s)-2]
printSlice(s)
// Drop its first two values.
s = s[2:]
printSlice(s)
}
func printSlice(s []int) {
var ptr *int
if cap(s) >= 1 {
ptr = &s[:cap(s)][0]
}
fmt.Printf("ptr=%p len=%d cap=%d %v\n", ptr, len(s), cap(s), s)
}
Детская площадка: https://play.golang.org/p/pk3cpE_LsUV
Вывод:
ptr=0x450000 len=6 cap=6 [2 3 5 7 11 13]
ptr=0x450000 len=4 cap=6 [2 3 5 7]
ptr=0x450008 len=2 cap=4 [5 7]
Посмотрите, как ваши операции нарезки корректируют указатель, длину и емкость.Срез - это просто представление или окно в базовый массив.
Ссылки:
The Go Blog: Слайсы Go: использование и внутренние компоненты
Спецификация языка программирования Go: