Skip to content

在 Go 语言中,nil 是一个预定义的标识符,表示指针、切片、映射、通道、接口和函数等类型的零值或未初始化的值。它在不同类型下的含义并不相同:

1. 指针类型 ​

在 Go 中,指针类型的零值是 nil。nil 表示指针不指向任何有效的内存地址。

go
func main() {
    var ptr *int
    fmt.Println(ptr) // 输出: <nil>
}

2. 切片、映射、通道 ​

对于切片、映射和通道,它们的零值也是 nil。这意味着它们未初始化时都会被赋予 nil 值,表示它们还没有分配底层的数据结构。

go
func main() {
    var slice []int
    var m map[string]int
    var ch chan string

    fmt.Println(slice) // 输出: []
    fmt.Println(m)     // 输出: map[]
    fmt.Println(ch)    // 输出: <nil>
}

3. 接口类型 ​

对于接口变量,当其未被初始化或赋值时,默认值也是 nil。一个 nil 接口值既不持有值也不具备具体的类型。

go
func main() {
    var i interface{}
    fmt.Println(i) // 输出: <nil>
}

4. 函数 ​

在 Go 中,函数类型的零值也是 nil。这表示一个未初始化的函数变量。

go
func main() {
    var f func()
    fmt.Println(f) // 输出: <nil>
}

使用场景 ​

nil 在实际编程中有多种用途:

  • 初始化检查:判断指针、切片、映射、通道或接口是否已初始化或赋值。

    go
    var ptr *int
    if ptr == nil {
        fmt.Println("Pointer is nil")
    }
  • 清理资源:把不再使用的引用置为 nil,让底层数据结构失去引用。

  • 默认值:指针或接口为 nil 表示不持有任何有效值,可以直接当默认值用。

注意事项 ​

  • 当操作一个 nil 值的指针、切片、映射、通道或接口时,可能会导致运行时错误。在使用之前应该先进行有效性检查或初始化。

  • 对于函数类型的 nil,尝试调用它会导致运行时错误。应该先检查函数是否为 nil,然后再调用它。

示例代码 ​

以下是一个示例,展示了如何使用 nil 进行初始化检查和清理资源:

go
package main

import "fmt"

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

    var ch chan int
    fmt.Println(ch) // 输出: <nil>

    var f func()
    if f == nil {
        fmt.Println("Function is nil")
    }
}

总结 ​

nil 是指针、切片、映射、通道、接口和函数的零值,含义随类型而变。对值为 nil 的变量做操作之前,先判空或初始化。

参考资料 ​

相关页面 ​

Hello Golang