nil в Go

nil в Go - это предопределенный идентификатор, который обозначает нулевое значение для указателей, интерфейсов, слайсов, карт, каналов и функций. В отличие от других языков, где null или None могут быть присвоены любым типам, в Go nil не является типом, а представляет собой значение, которое можно присвоить только переменным определенных типов. При попытке присвоить nil переменной базового типа, например int или string, компилятор выдаст ошибку.

Синтаксис

govar ptr *int = nil
var slice []int = nil
var iface interface{} = nil

Пример

Создадим указатель на целое число и присвоим ему значение nil. Затем проверим, равен ли он nil:

gopackage main

import "fmt"

func main() {
  var p *int = nil
  if p == nil {
    fmt.Println("p is nil")
  }
}

Результат выполнения кода:

go"p is nil"

Пример

Попробуем разыменовать указатель, содержащий nil, что приведет к панике во время выполнения программы:

gopackage main

import "fmt"

func main() {
  var p *int = nil
  fmt.Println(*p) // panic: runtime error: invalid memory address or nil pointer dereference
}

Результат выполнения кода:

go"panic: runtime error: invalid memory address or nil pointer dereference"

Пример

Проверим, является ли пустой слайс равным nil. Обратите внимание, что пустой слайс не равен nil:

gopackage main

import "fmt"

func main() {
  var s1 []int = nil
  s2 := []int{}
  fmt.Println(s1 == nil) // true
  fmt.Println(s2 == nil) // false
}

Результат выполнения кода:

go"true"
"false"

Пример

Проверим, является ли пустая карта равной nil. Как и в случае со слайсами, пустая карта не равна nil:

gopackage main

import "fmt"

func main() {
  var m1 map[string]int = nil
  m2 := map[string]int{}
  fmt.Println(m1 == nil) // true
  fmt.Println(m2 == nil) // false
}

Результат выполнения кода:

go"true"
"false"

Смотрите также

  • оператор if,
    который используется для проверки условий
  • оператор var,
    который объявляет переменные с нулевыми значениями
  • тип type,
    который определяет пользовательские типы
  • ключевое слово func,
    которое объявляет функции и методы