The OpenNET Project / Index page

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



"Выпуск языка Go 1.20. SourceHut отменил блокировку зеркала модулей Go"
Версия для распечатки Пред. тема | След. тема
Форум Разговоры, обсуждение новостей
Исходное сообщение [ Отслеживать ]
Присылайте удачные настройки в раздел примеров файлов конфигурации на WIKI.opennet.ru.
. "Выпуск языка Go 1.20. SourceHut отменил блокировку зеркала м..." +/
Сообщение от cheshirekot (ok), 04-Фев-23, 20:21 
>> А что будет, если читать дальше первого предложения? А будет неудобно:
> The length of a slice s can be discovered by the built-in function len; unlike with arrays it may change during execution.

Да, действительно, неудобно очень читать до второго предложения и не видеть третье...

```
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]
```
ВНИМАТЕЛЬНО прочтите, что тут написано. Вот прямо дословно написано: "allocating array and slicing it". Даже для удобства гиперссылкой помечено, что такое "slicing". Вот там такое "Slice expressions construct a substring or slice from a string, array, pointer to array, or slice."

Понимаете, аллоцируется массив, слайс аллоцироваться не умеет, он просто диапазон "с элемента X по элемент Y массива Z". Вот прямо здесь, в примере из официальной спецификации, мы выделили массив на 100 элементов, и из этого уже алоцированного массива получили слайс - view'ха на первые 50 из них. И append'ить вы можете, но только в пределах cap'а, который равен длине массива. Если за cap вылазите, создается НОВЫЙ СЛАЙС. Потому и append так странно выглядит.

Еще раз повторю: слайс - это диапазон, определенный над массивом, о чем вам в ОФИЦИАЛЬНОЙ СПЕЦИФИКАЦИИ прямым текстом говорят. В связи с этим слайс не умеет ничего алоцировать и ресайзить, что делает его буквально представлением над обычным массивом константной длины. Он, в конце концов, даже называется, прямым текстом, "slice". Не dynamic array, не list, не vector, он именно slice - погуглите перевод.

Вот вы прямым текстом тут писали, что у слайса cap измениться может.
Давайте попробуем:

a := make([]int, 0, 10) // очевидно, cap=10 же?

Подскажите мне, пожалуйста, каким штатным образом (без рефлексии и unsafe-блоков) я могу изменить cap конкретно этого слайса. Покажете - 10 баксов дам! Не покажете - слайс не является динамическим массивом (ЧИТД)

Ответить | Правка | Наверх | Cообщить модератору

Оглавление
Выпуск языка Go 1.20. SourceHut отменил блокировку зеркала модулей Go, opennews, 02-Фев-23, 11:04  [смотреть все]
Форумы | Темы | Пред. тема | След. тема



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

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