Уменьшение емкости среза

мой вопрос о длине и емкости среза. Я узнаю о Go here:https://tour.golang.org/moretypes/11.

(мой вопрос был отмечен как возможный дубликат этой, однако, это не тот случай. Мой вопрос конкретно касается отрезания первых нескольких элементов среза и последствий этого.)

почему строка s = s[2:] снижение мощности при s = s[:4] и s = s[:0] не? Единственный разница в том, что перед двоеточием в s = s[2:] пока есть число после двоеточия в двух других линий.

есть ли способ восстановить первые два элемента, которые мы отрезали с s = s[2:]?

package main

import "fmt"

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 %vn", 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 ответов


вы можете узнать больше о slices здесь. Но я думаю, что этот отрывок отвечает на ваш вопрос:

нарезка не копирует данные среза. Он создает новое значение среза, которое указывает на исходный массив. Это делает операции среза столь же эффективными, как и манипулирование индексами массива. Поэтому изменение элементов (а не самого среза) повторного среза изменяет элементы исходного среза.

таким образом, вы не можете восстановить данные среза, если вы присваиваете его той же переменной.

уменьшение емкости связано с тем, что, отбросив первые 2 элемента, вы меняете указатель на новый срез (срезы ссылаются указателем на первый элемент).

как срезы представлены в памяти: def

make([]byte, 5)

memory vis

s = s[2:4]

slice cap decrease