>> Т.е. о том, что у среза фиксированная длина - а вам не кажется странным, что функция в названии содержит слово grow? Не make, create или new, а именно grow? А если комментарии в коде почитать?Дык, а давайте прямо комментарии в коде и почитаем.
Строка 126: // growslice allocates new backing store for a slice.
Ну и в код заглянем, в сам метод, с 281 строки:
```
memmove(p, oldPtr, lenmem)
return slice{p, newLen, newcap}
}
```
внимательно смотрим...
делай раз: копируем содержания старого слайса в новый
делай два: возвращаем новый слайс
Понимаете, в чем фокус? Там НЕ в существующем слайсе указатель на массив меняется, а НОВЫЙ СЛАЙС создается! Т.е., дословно, мы НЕ МЕНЯЛИ размер текущего слайса, мы СОЗДАЛИ НОВЫЙ СЛАЙС. Не новый массив в слайс положили, что было бы логично, исходя из концепции "слайс - это динамический массив", а создали ДРУГОЙ СЛАЙС (что логично, исходя из концепции "слайс - это динамическое представление").
Динамический массив - это штука, у которой мы можем поменять размер.
Вот вектор - это реализация "динамического массива". Да, внутри точно так же создается новый массив, но это происходит внутри вектора. Т.е. в результате мы получаем ТОТ ЖЕ САМЫЙ вектор, внутри которого лежит новый массив. И это законно, нам по барабану, что там с массивами, мы с вектором работаем, а с ним ничего странного не происходит, это все тот же вектор, у него даже адрес в памяти тот же самый. Что у него внутри изменилось - это его головняк, он на то и абстракция.
А в случае со слайсом - кухня-то та же самая. Но, при append'е, вызвавшем resize массива мы получаем ДРУГОЙ слайс. Не другой массив, не слайс, у которого изменился содержащийся в нем массив... Там другой слайс! Вот ровно для этого пишут:
slice1 = append(slice1, 10)
Не потому что оно "функциональное" и т.д. и т.п. А потому что при append'е может вернуться ДРУГОЙ СЛАЙС. Это другой объект, другой инстанс, у него другой адрес в памяти. Вот это присвоение - оно для того, чтобы в переменную, в которой лежал слайс, в случае чего, не забыть положить новый.
При этом вы совершенно законно можете ничего никуда не присваивать. Просто написать append(slice1, 10). И ничего не случится. И даже все будет хорошо... Ну, пока за cap не заступите. После этого на каждый append будет создаваться новый слайс, будет выделяться память, слайс будет инициализироваться и... и тупо отдаваться сборщику мусора... В старом ничего не изменится.
>> Хотя, как мы на этом примере видим, с тем как оно на самом деле работает, у вас тоже не всегда всё гладко, но это правда мелочи.
Не, это не я пытаюсь доказать, что слайс работает так, как std::vector... Ну вот он не так работает. Вектор умеет ресайз. Слайс - нет, зато append умеет создавать новый слайс по необходимости.
>> попробовать взглянуть на предмет иначе - в оригинальной терминологии и концепциях авторов.
Ну вот я вам в оригинальной терминологии и концепциях авторов говорю, дословно: слайс - это "flexible view into the elements of an array" (гибкое представление элементов массива). А вы мне: слайс - это динамический массив.
Вот даже в спецификацию заглянул, не поленился:
"A slice is a descriptor for a contiguous segment of an underlying array and provides access to a numbered sequence of elements from that array. " - слайс является дескриптором непрерывного сегмента нижележащего массива и предоставляет доступ к перечислимой последовательности элементов из этого массива.
Оттуда же почитаем?
"A slice, once initialized, is always associated with an underlying array that holds its elements." - слайс, будучи инициализированным, всегда ассоциирован с нижележащим массивом, содержащим его элементы. Прям так и говорят - слайс ассоциируется с массивом при инициализации...
Короче, найдите мне в спецификации хотя бы слово про том, что слайс - динамический массив, и я вам пива куплю (подскажу, там такого нет).