任何一个变量在声明之后会自动被赋予一个零值。数值类型的变量零值为0,字符串为"",而指针、切片、map、通道、函数和接口的零值就是nil。
package main
import "fmt"
func main() {
var m map[int]string
var p \*int
var c chan int
var s []int
var f func()
var i interface{}
fmt.Printf("map:%#v\n", m)
fmt.Printf("指针:%#v\n", p)
fmt.Printf("通道:%#v\n", c)
fmt.Printf("切片:%#v\n", s)
fmt.Printf("函数:%#v\n", f)
fmt.Printf("接口:%#v\n", i)
}
map:map[int]string(nil)
指针:(\*int)(nil)
通道:(chan int)(nil)
切片:[]int(nil)
函数:(func())(nil)
接口:<nil>
Go 语言中 nil 和 nil 之间是无法比较的。
package main
import "fmt"
func main() {
fmt.Println(nil == nil)
}
# command-line-arguments
./2.go:6:18: invalid operation: nil == nil (operator == not defined on nil)
不同类型的变量的内存分配都是不同的,即使是 nil ,分配的内存也是不同的。
package main
import (
"fmt"
"unsafe"
)
func main() {
var m map[int]string
var p \*int
var c chan int
var s []int
var f func()
var i interface{}
fmt.Println("map:", unsafe.Sizeof(m))
fmt.Println("指针:", unsafe.Sizeof(p))
fmt.Println("通道:", unsafe.Sizeof(c))
fmt.Println("切片:", unsafe.Sizeof(s))
fmt.Println("函数:", unsafe.Sizeof(f))
fmt.Println("接口:", unsafe.Sizeof(i))
}
map: 8
指针: 8
通道: 8
切片: 24
函数: 8
接口: 16
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。