nil в Go
nil в Go - это предопределенный идентификатор, который обозначает нулевое значение для
указателей, интерфейсов, слайсов, карт, каналов и функций. В отличие от других языков,
где null или None могут быть присвоены любым типам, в Go nil
не является типом, а представляет собой значение, которое можно присвоить только
переменным определенных типов. При попытке присвоить nil переменной базового типа,
например int или string, компилятор выдаст ошибку.
Синтаксис
var ptr *int = nil
var slice []int = nil
var iface interface{} = nil
Пример
Создадим указатель на целое число и присвоим ему значение nil.
Затем проверим, равен ли он nil:
package main
import "fmt"
func main() {
var p *int = nil
if p == nil {
fmt.Println("p is nil")
}
}
Результат выполнения кода:
"p is nil"
Пример
Попробуем разыменовать указатель, содержащий nil,
что приведет к панике во время выполнения программы:
package main
import "fmt"
func main() {
var p *int = nil
fmt.Println(*p) // panic: runtime error: invalid memory address or nil pointer dereference
}
Результат выполнения кода:
"panic: runtime error: invalid memory address or nil pointer dereference"
Пример
Проверим, является ли пустой слайс равным nil.
Обратите внимание, что пустой слайс не равен nil:
package main
import "fmt"
func main() {
var s1 []int = nil
s2 := []int{}
fmt.Println(s1 == nil) // true
fmt.Println(s2 == nil) // false
}
Результат выполнения кода:
"true"
"false"
Пример
Проверим, является ли пустая карта равной nil.
Как и в случае со слайсами, пустая карта не равна nil:
package 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
}
Результат выполнения кода:
"true"
"false"