The OpenNET Project / Index page

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



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

Исходное сообщение
"Выпуск языка Go 1.20. SourceHut отменил блокировку зеркала м..."
Отправлено cheshirekot, 04-Фев-23 20:47 
>> В старом изменяется длина, но остаётся прежним capacity. Т.е слайс таки имеет динамический РАЗМЕР, а capacity это всё же деталь реализации, которая и делает из слайсов какую-то херь

Ну вот нет же...

```
    s0 := make([]int, 10, 10)
    fmt.Printf("len=%d|cap=%d\n", len(s0), cap(s0))
    _ = append(s0, 10)
    fmt.Printf("len=%d|cap=%d\n", len(s0), cap(s0))
```

Запустите, не поленитесь. Ни len ни cap не изменились. Ну т.е. вот это "В старом изменяется длина, но остаётся прежним capacity." - неправда. Длина не может быть выше вместимости, и слайс динамического РАЗМЕРА не имеет. Он вообще размера не имеет, размер есть у нижележащего массива, который таки массив статической длины.

А вот когда аппендить надо, а оно не лезет, создается НОВЫЙ массив, в который влезет, в него копируется содержимое старого массива + то, что должно влезть, и поверх этого берется НОВЫЙ слайс.

Если бы при этой операции был СТАРЫЙ слайс с указателем на НОВЫЙ массив внутри - я бы слова не сказал, это бы и были внутренние детали реализации. Но это именно что НОВЫЙ слайс. Т.е. не "я тут в слайсе массив пересоздал, пользуйся", а "твой старый слайс пришел в негодность, вот тебе новый". А "старый" в негодность пришел именно по причине, что он НЕ МОЖЕТ двигаться за пределы массива, т.е. он вообще ни разу не динамический.

Ну или мы обычный массив динамическим считать начинаем. Просто представьте ситуацию:
1. Нам нужен массив примерно на 10-15 элементов.
2. Мы, чтобы не наступать в излишнии аллокации, выделяем массив на 20.
3. Начинаем append'ить элементы... Ну, точнее, просто по индексу значения выставлять, ничего никуда мы не append'им, просто устанавливаем значения в имеющемся массиве.
4. И тут выясняется, что мы обсчитались, нужен 21-й элемент...
5. Мы выделяем новый массив, на всякий случай на 40 элементов, копируем туда первые 20, потом устанавливаем 21-й по индексу, работаем дальше с новым массивом, старый забываем.
Это у нас сейчас "динамический массив" сейчас был? Я правильно понял?

Или для того, чтобы называть некую сущность динамическим массивом, таки нужно, чтобы это поведение было ВНУТРИ этой сущности?

>>  Т.е слайс таки имеет динамический РАЗМЕР

Слайс, к сожалению, динамического размера не имеет. Слайс - это структура, состоящая из 3 полей: len, cap, array. Два int'а и один unsafe.Pointer. Ну, т.е. в сумме 3 машинных слова, получается.

Все потому, что слайс - это диапазон элементов массива. У него, заметьте, даже offset'а никакого нет, т.е. в unsafe.Pointer'е не на начало массива указатель, а на нулевой элемент слайса.

Спека:
```
make([]T, length, capacity)
produces the same slice as allocating an array and slicing it, so these two expressions are equivalent:

make([]int, 50, 100)
new([100]int)[0:50]
```

Вот прямо тут - аллоцируется массив, и от него берется слайс. Слайс - это диапазон с 1-го по 50-й элемент этого массива, в cap ложится 100. Напишите [1:51] - будет со второго по 51-й, с cap'ом 99. И вот до конца массива слайс может что-то делать. При выходе за cap - уже нет, там уже новый слайс.

 

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



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

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