Какие типы в Go можно сравнивать с `nil`?

Ответ

В 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) или структуры приведёт к ошибке компиляции.