>> В 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)", и с этим сокровенным знанием идти работать, нести откровение в мир... А можно, блин, прочитать, что такое слайс в спецификации языка, и вопрос о неуклюжести конструкции отпадет сам собой...