The OpenNET Project / Index page

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



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

Исходное сообщение
"Выпуск языка Go 1.20. SourceHut отменил блокировку зеркала м..."
Отправлено qrKot, 07-Фев-23 10:10 
>> В go слайсы это полный треш, нихрена не такие удобные как их хорошо пропиарили

В Go слайсы - это "дескриптор непрерывного сегмента нижележащего массива, предоставляющий доступ к перечислимой последовательности элементов этого массива". Именно в этой роли - вполне себе не ужас. Ужас - это считать, что слайс - реализация динамического массива, потому что он вообще не массив (и не связный список, и внутри у него ни того, ни другого нет) и ни разу не динамический.

В конечном итоге, динамических массивов в Go нет, как, впрочем, и в десятках других языков. А функциональную потребность в динамическом массиве принято закрывать набором обвязок из make и append. Собственно, ровно так же, как это делается в том же C, например.

Ничего страшного в этом нет, а миф о том, что слайс - плохой динамический массив, проистекает из того факта, что слайс НЕ динамический массив. Собственно, лошадь с телегой тоже хреновый грузовой автомобиль, хотя функциональную потребность и закрывает.

>> да и вообще языку нужны нормальные типы контейнеров

В целом, скорее соглашусь. Только не языку, а стандартной библиотеке языка. К слову, можете даже написать, это быстро.

Навскидку, наивное решение, вот прямо так и будет выглядеть:
```
var ErrLengthExceeded = errors.New("index out of range")

type DynamicArray[T any] struct {
    slice []T
}

func NewDynamicArray[T any](cap int) *DynamicArray[T] {
    return &DynamicArray[T]{
        slice: make([]T, 0, cap),
    }
}
func (da *DynamicArray[T]) Append(values ...T) {
    da.slice = append(da.slice, values...)
}
func (da *DynamicArray[T]) At(index int) (T, error) {
    if len(da.slice) <= index {
        return nil, ErrLengthExceeded
    }
    return da.slice[index], nil
}
```

>> нормальный синтаксис для классов (можно хоть не вводить this)

А вот классов-то в Go и нет... Отсутствие синтаксиса для отсутствующей сущности - нормальный синтаксис, ничего менять не надо.

>> Рефлексии для приватных объектов нет.

А она для чего-то реально нужна?

>> Если написать свой тип данных то вся type safety исчезает.

Вот это неправда. То, чего изначально нет, исчезнуть не может. В Go нет type safety, никогда не было, и даже не декларировалось.

>> В одном его рантайме целый вагон различных моментов где можно словить panic.

Собственно, как и в любом рантайме любого языка...

>> По сути нужно знать дофига моментов почему тут нужно делать не так, а вот здесь nil не nil.

Ну, блин, можно заучить мантру "в слайс (это типа динамический массив такой) значения добавляются неуклюжей конструкцией slice = append(slice, value)", и с этим сокровенным знанием идти работать, нести откровение в мир... А можно, блин, прочитать, что такое слайс в спецификации языка, и вопрос о неуклюжести конструкции отпадет сам собой...

 

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



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

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