The OpenNET Project / Index page

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



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

Исходное сообщение
"Выпуск языка Go 1.20. SourceHut отменил блокировку зеркала м..."
Отправлено cheshirekot, 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 баксов дам! Не покажете - слайс не является динамическим массивом (ЧИТД)

 

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



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

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