golang中的nil

结论:

1、nil不是golang的关键字,可以进行赋值操作。但是不建议
2、nil标识符是没有类型的,所以==对于nil来说是一种未定义的操作,不可以进行比较,而这个在python中是可以比较的,在 python 中,两个None 值永远相等

3、同类型的nil比较中,指针类型nil、channel类型的nil、interface类型可以相互比较,而func类型、map类型、slice类型只能与nil标识符比较,两个类型相互比较是不合法的。

// 指针类型的nil比较
	fmt.Println((*int64)(nil)==(*int64)(nil)) // true
	// chan类型的nil比较
	fmt.Println((chan int)(nil)==(chan int)(nil)) // true
	// 函数类型的nil比较
	fmt.Println((func())(nil)==nil) // true
	// fmt.Println((func())(nil) == (func())(nil)) // func() 只能与nil进行比较

	// 空接口类型的nil比较
	fmt.Println((interface{})(nil)==(interface{})(nil)) // true
	
	// map类型的nil比较
	// fmt.Println((map[string]int)(nil) == (map[string]int)(nil)) // map 只能与nil进行比较

	// fmt.Println(([]*int64)(nil) == ([]*int64)(nil)) // slice 只能与nil进行比较

4、不同类型的nil比较:指针类型和channel类型与接口类型可以比较,其他类型的之间是不可以相互比较的。为什么指针类型、channel类型可以和接口类型进行比较呢?(目前不明白,推测能互相比较类型都是引用类型,不能比较的是值类型)

5、interface和nil比较时,只有interface底层的数据结构中,必须要类型和值同时都为 nil 的情况下,interface 的 nil 判断才会为 true

6、一个nil的map可以读数据,不可以写数据,所以使用的时候要用make初始化

7、一个nil的chan,读写都会阻塞,关闭会panic

8、一个为nil的slice,不可以进行索引,否则会引发panic,其他操作是可以。

详细参考:

面试官:两个nil比较结果是什么?
视频学习

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值