Чем отличается make([]int, 5) от make([]int, 0, 5) в Go?
Если очень коротко и по делу, то:
* make([]int, 5) — создаёт слайс с длиной 5 и ёмкостью 5. Внутри уже лежат 5 нулей. Можно сразу читать и писать по индексам от 0 до 4 * make([]int, 0, 5) — создаёт слайс с длиной 0 и ёмкостью 5. Внутри память выделена, но элементов нет. При append элементы будут добавляться с первого места, без лишних аллокаций.
Зачем так?
Первый вариант удобен, если вы знаете точное количество элементов и хотите заполнять их по индексу: s[0] = 42.
Второй — если вы не знаете, сколько элементов будет, но примерно прикидываете (например, 5). Тогда append сработает быстро, без постоянного расширения массива под капотом.
Небольшой пример прикрепил к этому посту. 👇