В чем разница между nil-слайсом и пустым слайсом в Go?

Ответ

Хотя nil-слайс и пустой слайс часто ведут себя похоже (например, имеют len и cap равные 0), это не одно и то же.

  • Nil-слайс — это нулевое значение для типа слайс. Указатель на базовый массив равен nil.
    var s1 []int
    fmt.Println(s1 == nil) // true
  • Пустой слайс — это слайс с нулевой длиной, но у него есть указатель на существующий (хоть и пустой) базовый массив. Он не равен nil.
    s2 := []int{} // или make([]int, 0)
    fmt.Println(s2 == nil) // false

Ключевые отличия:

  1. Внутреннее представление: У nil-слайса указатель на массив — nil, у пустого — нет.
  2. Сравнение с nil: Только nil-слайс равен nil.
  3. Сериализация в JSON: Это важное практическое различие.
    • json.Marshal(nilSlice) вернет null.
    • json.Marshal(emptySlice) вернет [].

К обоим типам слайсов можно без проблем применять встроенную функцию append. Go корректно обработает nil-слайс, выделив под него новый массив.