Go 语言中的 nil

nil 是 Go 语言中内置的一个标识符,有人会把它当作其它语言中的NULL,这个是不准确的。本文就来介绍一下 Go 语言中的 nil 的特点。

 

1. nil 是特殊的零值

在 Go 语言中,任何一个变量在声明之后会自动被赋予一个零值。数值类型的变量零值为0,字符串为””,而指针、切片、map、通道、函数和接口的零值就是nil。

代码示例

代码块
  • package main
  • 2
  • import (
  • 4          "fmt"
  • )
  • 6
  • func main() {
  • 8          var m map[int]string
  • 9          var p *int
  • 10        var c chan int
  • 11        var s []int
  • 12        var f func()
  • 13        var i interface{}
  • 14        fmt.Printf("map:%#vn", m)
  • 15        fmt.Printf("指针:%#vn", p)
  • 16        fmt.Printf("通道:%#vn", c)
  • 17        fmt.Printf("切片:%#vn", s)
  • 18        fmt.Printf("函数:%#vn", f)
  • 19        fmt.Printf("接口:%#vn", i)
  • 20  }

执行结果:

图片描述

 

2. nil 标识符无法比较

与其他语言不同,在 Go 语言中 nil 和 nil 之间是无法比较的

代码示例

代码块
  • package main
  • 2
  • import (
  • 4          "fmt"
  • )
  • 6
  • func main() {
  • 8          fmt.Println(nil == nil)
  • }

执行结果:

图片描述

而在 Java 中

代码块
  • class Untitled {
  • 2          public static void main(String[] args) {
  • 3                    System.out.println(null==null);
  • 4           }
  • }

以上代码会输出 true

 

3. 不同类型的 nil 的长度不同

不同类型的变量的内存分配都是不同的,即使是 nil ,分配的内存也是不同的。

代码示例:

代码块
  • package main
  • 2
  • import (
  • 4          "fmt"
  • 5          "unsafe"
  • )
  • 7
  • func main() {
  • 9          var m map[int]string
  • 10        var p *int
  • 11        var c chan int
  • 12        var s []int
  • 13        var f func()
  • 14        var i interface{}
  • 15        fmt.Println("map:", unsafe.Sizeof( m ))
  • 16        fmt.Println("指针:", unsafe.Sizeof(p))
  • 17        fmt.Println("通道:", unsafe.Sizeof(c))
  • 18        fmt.Println("切片:", unsafe.Sizeof(s))
  • 19        fmt.Println("函数:", unsafe.Sizeof(f))
  • 20        fmt.Println("接口:", unsafe.Sizeof(i))
  • 21  }

执行结果:

图片描述

 

4. 小结

本文主要介绍了 Go 语言中的特殊标识符 nil 的一些特性:

  • nil 是作为标识一些特殊类型变量的零值存在的;
  • nil 和 nil 是无法比较的,nil 可以零值为 nil 的变量比较
  • nil 的长度随着类型变化而变化

文章来源于网络,侵删!

相关新闻