Я поставив це питання кілька місяців тому, коли вперше розпочав розслідування щодо Го. Відтоді щодня я читаю про 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 з intto int64повинен бути явним. Але всі методи для list.List беруть порожні інтерфейси - все йде.
Однією з причин того, що я відмовився від Python і перейшов до Go, є така слабкість у системі типів Python, хоча Python стверджує, що вона "сильно набрана" (IMO це не так). Go's, list.Listздається, є свого роду "дворняжкою", народженою C ++ vector<T>та Python
List(), і, можливо, трохи недоречна в самому Go.
Мене не здивує, якщо в якийсь момент у не надто віддаленому майбутньому ми знайдемо список. Список застарілих в Go, хоча, можливо, він і залишиться, щоб врахувати ті рідкісні ситуації, коли навіть за допомогою хорошої практики дизайну проблему можна найкраще вирішити з колекцією, що містить різні типи. Або, можливо, тут є «місток» для розробників сімейства C, щоб вони почувались комфортно з Go, перш ніж вони вивчать нюанси фрагментів, які є унікальними для Go, AFAIK. (У деяких відношеннях фрагменти здаються схожими на класи потоку в C ++ або Delphi, але не цілком.)
Незважаючи на те, що я виходив з фону Delphi / C ++ / Python, під час мого першого впливу на Go я виявив, що list.Listвін був більш знайомим, ніж фрагменти Go, оскільки мені стало зручніше Go, я повернувся і змінив усі свої списки на фрагменти. Я ще нічого не знайшов sliceі / або mapне дозволяю мені робити таке, що мені потрібно використовувати list.List.
listтип Python не реалізований за допомогою пов'язаного списку: він поводиться подібно до фрагмента Go, іноді вимагає розширення копій даних.