Ответ
В Go nil является нулевым значением для определённых ссылочных типов. Сравнение с nil возможно только для следующих типов:
- Указатели (
*T) - Интерфейсы (
interface{}) - Срезы (
[]T) - Карты (
map[K]V) - Каналы (
chan T) - Функции (
func())
Эти типы по своей сути являются дескрипторами или указателями на базовые структуры данных, и nil означает, что они не инициализированы или не ссылаются ни на какой объект.
Пример:
var ptr *int
var iface interface{}
var sl []int
var m map[string]int
var ch chan int
var fn func()
fmt.Println(ptr == nil) // true, указатель никуда не указывает
fmt.Println(iface == nil) // true, интерфейс не содержит ни типа, ни значения
fmt.Println(sl == nil) // true, срез не инициализирован
fmt.Println(m == nil) // true, карта не инициализирована
fmt.Println(ch == nil) // true, канал не инициализирован
fmt.Println(fn == nil) // true, переменная функции не содержит ссылки на функциюПопытка сравнить с nil значение базового типа (например, int, string, bool) или структуры приведёт к ошибке компиляции.