Ответ
Хотя 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
Ключевые отличия:
- Внутреннее представление: У nil-слайса указатель на массив —
nil
, у пустого — нет. - Сравнение с
nil
: Только nil-слайс равенnil
. - Сериализация в JSON: Это важное практическое различие.
json.Marshal(nilSlice)
вернетnull
.json.Marshal(emptySlice)
вернет[]
.
К обоим типам слайсов можно без проблем применять встроенную функцию append
. Go корректно обработает nil-слайс, выделив под него новый массив.