Я задал этот вопрос несколько месяцев назад, когда впервые начал изучать Go. С тех пор я каждый день читал о Go и программировании на Go.
Поскольку я не получил четкого ответа на этот вопрос (хотя я принял один ответ), я сейчас отвечу на него сам, основываясь на том, что я узнал, поскольку я его задал:
Есть ли способ создать массив / фрагмент в Go без жестко заданного размера массива?
Да. Для срезов не требуется жестко запрограммированный массив slice
из:
var sl []int = make([]int,len,cap)
Этот код выделяет срез sl
размером len
с емкостью cap
- len
и cap
представляет собой переменные, которые могут быть назначены во время выполнения.
Почему list.List
игнорируется?
Похоже, что основными причинами list.List
, по которым в Go уделяется мало внимания, являются:
Как было объяснено в ответе @Nick Craig-Wood, со списками практически ничего нельзя сделать, что нельзя сделать с помощью срезов, часто более эффективно и с более чистым и элегантным синтаксисом. Например, конструкция диапазона:
for i:=range sl {
sl[i]=i
}
не может использоваться со списком - требуется стиль C для цикла. И во многих случаях синтаксис стиля коллекции C ++ должен использоваться со списками:
push_back
и т. Д.
Возможно, что еще более важно, list.List
не является строго типизированным - он очень похож на списки и словари Python, которые позволяют смешивать различные типы вместе в коллекции. Кажется, это противоречит подходу Go к вещам. Go - это язык с очень строгой типизацией - например, неявные преобразования типов никогда не допускаются в Go, даже upCast из int
в int64
должен быть явным. Но все методы для list.List принимают пустые интерфейсы - все идет.
Одна из причин, по которой я отказался от Python и перешел на Go, - это слабость такого рода в системе типов Python, хотя Python утверждает, что он «строго типизирован» (IMO это не так). Go list.List
кажется чем-то вроде «дворняги», порожденным C ++ vector<T>
и Python
List()
, и, возможно, немного неуместен в самом Go.
Меня не удивит, если в какой-то момент в не столь отдаленном будущем мы обнаружим list.List, который устарел в Go, хотя, возможно, он останется, чтобы приспособиться к тем редким ситуациям, когда даже с использованием хороших методов проектирования проблема может быть решена лучше всего. с коллекцией, содержащей различные типы. Или, возможно, он нужен для того, чтобы предоставить разработчикам семейства C «мост», чтобы они могли освоиться с Go, прежде чем они узнают нюансы срезов, которые уникальны для Go, AFAIK. (В некоторых отношениях срезы кажутся похожими на классы потоков в C ++ или Delphi, но не полностью.)
Несмотря на то, что я пришел из среды Delphi / C ++ / Python, при первом знакомстве с Go я обнаружил, list.List
что он более знаком, чем фрагменты Go, поскольку я стал более комфортно работать с Go, я вернулся и изменил все свои списки на фрагменты. Я еще ничего не нашел slice
и / или map
не разрешаю мне делать то, что мне нужно использовать list.List
.
list
тип Python не реализуется с использованием связанного списка: он ведет себя аналогично слайсу Go, иногда требуя расширения копий данных.