空值与零值

go空值与零值 #

零值: 又叫默认值、初始值
空值:理解为只定义声明未赋值的变量,且值为nil的,就是下面说的第4点
nil: go内置标识符,类似其它语言的null(NULL)值,是切片,map字典,函数,指针变量,通道、接口的零值

1. 整型和浮点型变量默认值(零值)为0
2. 字符串变量默认值(零值)为空字符串
3. bool型变量默认值(零值)为false
4. 切片,map字典,函数,指针变量,通道、接口 默认值(零值)为nil
    var am map[int]string
    fmt.Printf("%#v %p", am, am) //map[int]string(nil) 0x0
5. 数组的默认值(零值)取决于数组的类型,示例:var a [2]int //默认值为 [0 0]

go中允许定义nil变量 #

var nil = 100
fmt.Println(nil) //打印 100
备注: 说明nil不是关键字或保留字,但不推荐定义nil变量

nil标识符不能比较运算 #

package main
import "fmt"
func main()  {
	fmt.Println(nil == nil)
}
以上代码报语法错误:
    invalid operation: nil == nil (operator == not defined on nil)

nil没有默认类型 #

fmt.Printf("%T", nil) //<nil>

值为nil的变量地址是一样的 #

package main
import "fmt"
func main()  {
	var a []int = nil
	var b []int
	var c *int
	fmt.Printf("%p %p %p", a, b,c) //0x0 0x0 0x0
}

值为nil的变量不能进行比较运算,但可与nil比较 #

var m map[int]string
var ptr *int
fmt.Printf(m == ptr) //报语法错误

var s1 []int
var s2 []int
fmt.Printf(s1 == s2) //报语法错误

var s1 []int
fmt.Println(s1 == nil) //true

默认值为nil的变量总结 #

var m map[int]string
var ptr *int
var c chan int
var sl []int
var f func()
var i interface{}
fmt.Printf("%#v\n", m) //map[int]string(nil)
fmt.Printf("%#v\n", ptr) //(*int)(nil)
fmt.Printf("%#v\n", c) //(chan int)(nil)
fmt.Printf("%#v\n", sl) //[]int(nil)
fmt.Printf("%#v\n", f) //(func())(nil)
fmt.Printf("%#v %p\n", i, i) //<nil> %!p(<nil>)

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

package main
import (
	"fmt"
	"unsafe"
)
func main()  {
	var p *struct{}
	fmt.Println( unsafe.Sizeof( p ) ) // 8
	var s []int
	fmt.Println( unsafe.Sizeof( s ) ) // 24
	var m map[int]bool
	fmt.Println( unsafe.Sizeof( m ) ) // 8
	var c chan string
	fmt.Println( unsafe.Sizeof( c ) ) // 8
	var f func()
	fmt.Println( unsafe.Sizeof( f ) ) // 8
	var i interface{}
	fmt.Println( unsafe.Sizeof( i ) ) // 16
}

Build by Loppo 0.6.15