Пустой срез и nil в Go
Срез без элементов бывает двух видов: еще не созданный и созданный пустым. В первом случае переменная объявлена с типом среза, но значение не задано: такой срез называют нулевым и обозначают словом nil. Его длина 0, элементов нет, обращаться к номерам нельзя, а перебор в цикле безопасен.
var emptyNil []int
fmt.Println(len(emptyNil))
fmt.Println(emptyNil == nil)
made := []int{}
fmt.Println(len(made))
fmt.Println(made == nil)
Пустой, но уже созданный срез записывают как []int{}: длина тоже 0, но он не равен nil. Сравнение с nil истинно только у нулевого среза. Проверим оба варианта:
Первые две строки покажут 0 и true, следующие снова 0 и false. Оба среза пусты для цикла, но только один из них nil.
Дан следующий код:
var data []int
Выведите длину и результат сравнения с nil.
Дан следующий код:
fresh := []int{}
Выведите длину и результат сравнения с nil.
Скажите, безопасен ли перебор нулевого среза целых в цикле.