Golang Изменение размера фрагмента. Меньше в двух направлениях, но больше возможно только в одном? - PullRequest
0 голосов
/ 25 января 2020

Мне просто интересно, почему, по-видимому, невозможно полностью восстановить измененный размер фрагмента.

package main

import (
    "fmt"
)

func main() {
    s := []int{1, 2, 3, 4, 5}
    fmt.Printf("len=%d cap=%d slice=%v\n", len(s), cap(s), s)
    fmt.Println("address of 0th element:", &s[0])

    s = s[1:4]
    fmt.Printf("len=%d cap=%d slice=%v\n", len(s), cap(s), s)
    fmt.Println("address of 0th element:", &s[0])

    // extend behind only ...
    s = s[:4]
    fmt.Printf("len=%d cap=%d slice=%v\n", len(s), cap(s), s)
    fmt.Println("address of 0th element:", &s[0])
}

https://play.golang.org/p/4Hwq9yfHeRR

Итак, чтобы снова получить первый элемент (1). Это может быть полезно в некоторых случаях. Я прочитал https://blog.golang.org/slices ... но я не понимаю, почему они так поступили. Хранить начальную позицию и 0-й элемент массива «звучит просто».

У меня такое ощущение, что я что-то не правильно понимаю или что я что-то упустил.

1 Ответ

2 голосов
/ 25 января 2020

Поскольку структура слайса имеет только указатель на первый элемент, целую длину и целочисленную емкость.

Здесь вы можете увидеть представление времени выполнения слайса здесь .

Так что, если мы назначив новый слайс той же переменной, мы потеряем элементы, расположенные перед новым первым элементом s = s[1:4], но если назначить s = s[:4], мы не потеряем емкость слайса.

Примечание: Вы все еще можете получить потерянные предметы с отражением и арифметикой указателя c, но это небезопасно и настоятельно не рекомендуется.

...