Go中的nil(零值)

package main

import (
	"fmt"
	"unsafe"
)

//Go语言中 nil 是一个预先定义好的标识符,它是许多类型的零值表示,
//有过其他编程语言开发经验的开发者也许会把 nil 看作其他语言中的 null(NULL),
//其实这并不是完全正确的,因为Go语言中的 nil 和其他语言中的 null 有很多不同点。

func main()  {
	//1.nil标示符是不能比较的
	//这点和 python 等动态语言是不同的,在 python 中,两个 None 值永远相等。
	//fmt.Println(nil==nil)//invalid operation: nil == nil (operator == not defined on nil)

	//2.nil没有默认类型
	fmt.Printf("%T",nil)//<nil>
	//print 在golang中 是属于输出到标准错误流中并打印,官方不建议写程序时候用它。可以再debug时候用
	//print(nil)//use of untyped nil

	//3.不同类型nil的指针是一样的
	var arr[]int
	var num *int
	fmt.Printf("%p\n",arr)  //0x0
	fmt.Printf("%p\n",num)  //0x0

	//4.不同类型的nil是不能比较的
	//var m  map[int]string
	//var ptr *int
	//fmt.Printf(m==ptr)  //invalid operation: m == ptr (mismatched types map[int]string and *int)


	//5.两个相同类型的nil值也可能无法比较
	//在Go语言中 map、slice 和 function 类型的 nil 值不能比较,比较两个无法比较类型的值是非法的
	var a1[]int
	//var a2[]int
	//fmt.Printf(a1==a2)  //invalid operation: a1 == a2 (slice can only be compared to nil)

	//单类型的可以直接与 nil 标识符进行比较
	fmt.Println(a1==nil) //true

	//6.nil是map,slice,pointer,channel,func,interface的零值
	var s1  map[int]string
	var s2  *int
	var s3 chan int
	var s4 []int
	var s5 func()
	var s6 interface{}
	//zero value(零值)是Go语言中变量在声明之后但是未初始化被赋予的该类型的一个默认值。
	fmt.Printf("%#v\n",s1)  //map[int]string(nil)
	fmt.Printf("%#v\n",s2)  //(*int)(nil)
	fmt.Printf("%#v\n",s3)  //(chan int)(nil)
	fmt.Printf("%#v\n",s4)  //[]int(nil)
	fmt.Printf("%#v\n",s5)  //(func())(nil)
	fmt.Printf("%#v\n",s6)  //<nil>


	//7.不同类型的nil值占用的内存大小可能不一样
	//一个类型的所有的值的内存布局都是一样的,nil 也不例外,nil 的大小与同类型中的非 nil 类型的大小是一样的。但是不同类型的 nil 值的大小可能不同。
	//具体的大小取决于编译器和架构,此处是64位架构和标准编译器下完成的,32位打印大小减半
	var  p  *struct{}
	fmt.Println(unsafe.Sizeof(p))  //8
	var  s[]int
	fmt.Println(unsafe.Sizeof(s))  //24
	var m  map[int]string
	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

}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值