The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Индекс форумов
Составление сообщения

Исходное сообщение
"Выпуск языка Go 1.20. SourceHut отменил блокировку зеркала м..."
Отправлено cheshirekot, 04-Фев-23 14:27 
>> Т.е. о том, что у среза фиксированная длина - а вам не кажется странным, что функция в названии содержит слово 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." - слайс, будучи инициализированным, всегда ассоциирован с нижележащим массивом, содержащим его элементы. Прям так и говорят - слайс ассоциируется с массивом при инициализации...

Короче, найдите мне в спецификации хотя бы слово про том, что слайс - динамический массив, и я вам пива куплю (подскажу, там такого нет).

 

Ваше сообщение
Имя*:
EMail:
Для отправки ответов на email укажите знак ! перед адресом, например, [email protected] (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
  Введите код, изображенный на картинке: КОД
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру