Почему / Как массив сохраняет свои инициализированные значения даже после нарезки и изменения? - PullRequest
0 голосов
/ 28 марта 2020

Я изучаю основы go, нашел это в туре здесь .

Я не понимаю, почему значения массива не равны 0 или нулю после s = s[:0]

func main() {
    s := []int{2, 3, 5, 7, 11, 13}
    printSlice(s)

    // Slice the slice to give it zero length.
    s = s[:0]
    printSlice(s)

    // Extend its length.
    s = s[:4]
    printSlice(s)

    // Drop its first two values.
    s = s[2:]
    printSlice(s)
}

func printSlice(s []int) {
    fmt.Printf("len=%d cap=%d %v\n", len(s), cap(s), s)
}

выход:

len=6 cap=6 [2 3 5 7 11 13]
len=0 cap=6 []
len=4 cap=6 [2 3 5 7]
len=2 cap=4 [5 7]

1 Ответ

0 голосов
/ 28 марта 2020

Срез - это представление массива. Срез создаст новый массив большего размера и скопирует содержимое только в случае превышения емкости. Срез будет продолжать использовать свой исходный массив, если вы урежете его. Когда вы создаете меньший срез, он все еще использует старый резервный массив с содержимым, оставшимся от предыдущих операций. Когда вы добавите к этому фрагменту, он будет продолжать использовать тот же массив, пока вы не превысите емкость.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...