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
}