首页 > 服务端语言 > Go 入门教程 > 34 Go 语言中的 nil

Go 语言中的 nil

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

1. nil 是特殊的零值

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

代码示例

package main

import (
    "fmt"
)

func main() {
    var m map[int]string
    var p *int
    var c chan int
    var s []int
    var f func()
    var i interface{}
    fmt.Printf("map:%#v\n", m)
    fmt.Printf("指针:%#v\n", p)
    fmt.Printf("通道:%#v\n", c)
    fmt.Printf("切片:%#v\n", s)
    fmt.Printf("函数:%#v\n", f)
    fmt.Printf("接口:%#v\n", i)
}

执行结果:

图片描述

2. nil 标识符无法比较

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

代码示例

package main

import (
    "fmt"
)

func main() {
    fmt.Println(nil == nil)
}

执行结果:

图片描述

而在 Java 中

class Untitled {
    public static void main(String[] args) {
        System.out.println(null==null);
    }
}

以上代码会输出 true

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

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

代码示例:

package main

import (
    "fmt"
    "unsafe"
)

func main() {
    var m map[int]string
    var p *int
    var c chan int
    var s []int
    var f func()
    var i interface{}
    fmt.Println("map:", unsafe.Sizeof( m ))
    fmt.Println("指针:", unsafe.Sizeof(p))
    fmt.Println("通道:", unsafe.Sizeof(c))
    fmt.Println("切片:", unsafe.Sizeof(s))
    fmt.Println("函数:", unsafe.Sizeof(f))
    fmt.Println("接口:", unsafe.Sizeof(i))
}

执行结果:

图片描述

4. 小结

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

  • nil 是作为标识一些特殊类型变量的零值存在的;
  • nil 和 nil 是无法比较的, nil 可以零值为 nil 的变量比较
  • nil 的长度 随着类型变化而变化
本文来自互联网用户投稿,不拥有所有权,该文观点仅代表作者本人,不代表本站立场。
访问者可将本网站提供的内容或服务用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯本网站及相关权利人的合法权利。
本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站,邮箱:80764001@qq.com,予以删除。
© 2023 PV138 · 站点地图 · 免责声明 · 联系我们 · 问题反馈