Я поставив це питання кілька місяців тому, коли вперше розпочав розслідування щодо Го. Відтоді щодня я читаю про 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
to 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, іноді вимагає розширення копій даних.