Go Nil
2021-01-04 本文已影响0人
JunChow520
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语言中map
、slice
、function
类型的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