Go Nil

作者: JunChow520 | 来源:发表于2021-01-04 02:34 被阅读0次

Go语言数据类型中,布尔类型的零值(初始值)为false,数值类型的零值为0,字符串类型的零值为空字符串""

对于pointer指针、slice切片、map映射、channel通道、function函数、interface接口的零值则为nil

nil是Go语言中预定义的标识符,Go语言中的nil并非等同于其它语言中的null

  • nil不是关键字或保留字,因此可以定义名为nil的变量,但不推荐。
  • nil标识符不能用于比较
nil == nil //invalid operation: nil == nil (operator == not defined on nil)
  • nil没有默认类型
print(nil) // use of untyped nil
  • 不同类型的nil的指针是一样的
var flag bool
var num int
var str string
var arr []int
var p *int

fmt.Printf("flag = %v, type = %T\n", flag, flag)//flag = false, type = bool
fmt.Printf("num = %v, type = %T\n", num, num)//num = 0, type = int
fmt.Printf("str = %v, type = %T\n", str, str)//str = , type = string
fmt.Printf("arr = %v, type = %T, pointer = %p\n", arr, arr, arr)//arr = [], type = []int, pointer = 0x0
fmt.Printf("p = %v, type = %T, pointer = %p\n", p, p, p)//p = <nil>, type = *int, pointer = 0x0
  • 不同类型的nil不能进行比较
var dict map[string]string
var ptr *int

fmt.Printf("dict = %v, type = %T, pointer = %p\n", dict, dict, dict)//dict = map[], type = map[string]string, pointer = 0x0
fmt.Printf("ptr = %v, type = %T, pointer = %p\n", ptr, ptr, ptr)//ptr = <nil>, type = *int, pointer = 0x0
print(dict == ptr) // invalid operation: dict == ptr (mismatched types map[string]string and *int)
  • 相同类型的nil值禁止比较

Go语言中mapslicefunction类型的nil值不能比较,比较两个无法比较类型的值是非法的。

  • 不同类型的nil值占用的内存大小可能不一样

一个类型的所有值的内存布局都是一样的,nil的大小与同类型非nil的大小保持一致,但不同类型的nil值的大小可能不同。具体大小取决于编译器和架构。

var dict map[string]string
fmt.Printf("dict = %v, type = %T, pointer = %p, size = %d\n", dict, dict, dict, unsafe.Sizeof(dict))
// dict = map[], type = map[string]string, pointer = 0x0, size = 8

相关文章

  • Go nil != nil

  • Go Nil

    Go语言数据类型中,布尔类型的零值(初始值)为false,数值类型的零值为0,字符串类型的零值为空字符串""。 对...

  • Go接口之nil != nil

    本文来自“灰子学技术”,原文链接如下所示:https://mp.weixin.qq.com/s/ZBd1UcIJF...

  • 【Golang】golang中使用defer关闭file句柄总是

    实例: 查看源码发现,go标准包中,如果打开文件出错,将返回nil的文件类型,而nil类型的变量调用Close()...

  • 七牛云 GO 语言周报【八月第 3 期】

    Go 语言第一深坑 – interface 与 nil 的比较 Go 语言以简单易上手而著称,它的语法非常简单,熟...

  • 小口啃 Golang - 返回的 nil 不为 nil 的疑惑

    前段时间在写代码的时候,遇到一个奇怪的问题,即返回的 nil 值,不为 nil。 导致这个问题的原因是对 Go 中...

  • 理解Go语言的nil

    最近在油管上面看了一个视频:Understanding nil,挺有意思,这篇文章就对视频做一个归纳总结,代码示例...

  • Go语言中的Nil

    在go语言中nil是一个经常使用的,重要的预先定义好的标识符。它是许多中类型的零值表示。 许多新有其他编程语言开发...

  • Go语言中的nil

    参考:http://c.biancheng.net/view/4776.html 关键点 字符串类型的零值为空字符...

  • go 语言中的 nil

    重点 接口在底层的实现有两个部分:type 和 data。 在源码中,显式地将 nil 赋值给接口时,接口的 ty...

网友评论

      本文标题:Go Nil

      本文链接:https://www.haomeiwen.com/subject/jdrmoktx.html