在 Golang 中 数值类型 的零值为 0, 布尔类型 的零值(初始值)为 false,字符串类型 的零值为空字符串 ""
,而指针、切片、映射、通道、函数 和接口等引用类型的零值则是 nil。
nil 标识符是不能比较的,所以我们比较两个 nil,会报错
package main
import (
"fmt"
)
func main() {
fmt.Println("嗨客网(www.haicoder.net)")
//nil 标识符是不能比较的,所以我们比较两个 nil,会报错
fmt.Println(nil == nil)
}
程序运行后,控制台输出如下:
我们将两个 nil 使用 == 进行比较,结果程序报错,说明两个 nil 是不能比较的。
因此 nil 不是关键字或保留字,所以我们可以定义变量名为 nil
package main
import (
"fmt"
)
func main() {
fmt.Println("嗨客网(www.haicoder.net)")
//因此 nil 不是关键字或保留字,所以我们可以定义变量名为 nil
var nil = 111
fmt.Println("Nil =", nil)
}
程序运行后,控制台输出如下:
我们将两个 nil 使用 == 进行比较,结果程序报错,说明两个 nil 是不能比较的。
不同类型 nil 的指针是一样的,都是 0x0
package main
import (
"fmt"
)
func main() {
fmt.Println("嗨客网(www.haicoder.net)")
//不同类型 nil 的指针是一样的,都是 0x00
var arr []int
var num *int
fmt.Printf("Arr = %p\n", arr)
fmt.Printf("Num = %p", num)
}
程序运行后,控制台输出如下:
我们将两个 nil 使用 == 进行比较,结果程序报错,说明两个 nil 是不能比较的。
不同类型的 nil 是不能进行比较的,比较程序会报错
package main
import (
"fmt"
)
func main() {
fmt.Println("嗨客网(www.haicoder.net)")
//不同类型的 nil 是不能进行比较的,比较程序会报错
var mapNil map[int]string
var intNil *int
fmt.Printf(mapNil == intNil)
}
程序运行后,控制台输出如下:
我们将两个 nil 使用 == 进行比较,结果程序报错,说明两个 nil 是不能比较的。
即使是两个相同类型的 nil 值也可能无法比较
package main
import "fmt"
func main() {
fmt.Println("嗨客网(www.haicoder.net)")
//即使是两个相同类型的 nil 值也可能无法比较
var s1 []int
var s2 []int
fmt.Printf(s1 == s2)
}
程序运行后,控制台输出如下:
即使是两个相同类型的 nil 值也可能无法比较,比较程序会报错。
nil 是常见引用类型的零值
package main
import "fmt"
func main() {
fmt.Println("嗨客网(www.haicoder.net)")
//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)
fmt.Printf("%#v\n", ptr)
fmt.Printf("%#v\n", c)
fmt.Printf("%#v\n", sl)
fmt.Printf("%#v\n", f)
fmt.Printf("%#v\n", i)
}
程序运行后,控制台输出如下:
nil 是常见引用类型的零值。