时间:2021-05-22
源码中的 nil 是这样定义的
// nil is a predeclared identifier representing the zero value for a// pointer, channel, func, interface, map, or slice type.var nil Type // Type must be a pointer, channel, func, interface, map, or slice type所以 nil 可以理解为这些类型的零值,声明一个变量在没有赋值的情况下,变量处于零值状态。
场景一
func t1() { var i interface{} var p *int fmt.Println("p==i", p == i) fmt.Println("i=", i, "i==null", i == nil) fmt.Println("p=", p, "p==nil", p == nil) fmt.Println("i TypeOf=", reflect.TypeOf(i), "i ValueOf", reflect.ValueOf(i)) fmt.Println("p TypeOf=", reflect.TypeOf(p), "p ValueOf", reflect.ValueOf(p)) i = p fmt.Println("---") fmt.Println("p==i", p == i) fmt.Println("i=", i, "i==null", i == nil) fmt.Println("p=", p, "p==nil", p == nil) fmt.Println("i TypeOf=", reflect.TypeOf(i), "i ValueOf", reflect.ValueOf(i)) fmt.Println("p TypeOf=", reflect.TypeOf(p), "p ValueOf", reflect.ValueOf(p))}真相是 i 刚开始没有类型,而 p 是有类型,所以 p 和 i 都等于 nil,但是 == 可以理解为 php 或者 js 里面的 === 全等,既要类型相等,也要值相等。
在 i = p 之后,p 和 i 类型和值保持了一致所以会相等,但是 i 已经不等于 nil 了,因为 nil 是 interface 的 0 值,或者说 i 已经指向 p ,i 现在是个有类型状态而非 0 值状态。
结果如下
p==i false
i= <nil> i==null true
p= <nil> p==nil true
i TypeOf= <nil> i ValueOf <invalid reflect.Value>
p TypeOf= *int p ValueOf <nil>
---
p==i true
i= <nil> i==null false
p= <nil> p==nil true
i TypeOf= *int i ValueOf <nil>
p TypeOf= *int p ValueOf <nil>
场景二
func t3() { f1 := func(i interface{}) bool { return i == nil } var a *int fmt.Println(f1(a)) // false fmt.Println(f1(nil)) // true}a 传递到 func 里面,被转成 interface,这个 interface 是有类型的 interface,相当于赋值了一下 i=a ,所以 i 的状态不是 interface 的零值状态 ,和 interface 零值状态的 nil 当然是不相等
场景三
type A struct {}func (A) a1() int { return 123}func (*A) a2() int { return 321}type B interface {}func t2() { var a A var ap *A var b B var bp *B fmt.Println("a=", a, "a.a1()", a.a1(), a.a2()) //a= {} a.a1() 123 321; a == nil 会抛错 struct 不能和 nil 进行比较 fmt.Println("ap=", ap, "ap==nil", ap == nil) //ap= <nil> ap==nil true fmt.Println("b=", b, " b==nil:", b == nil) // b= <nil> b==nil: true fmt.Println("bp=", bp, " bp==nil:", bp == nil) //bp= <nil> bp==nil: true}结构体的 0 值为 {}
到此这篇关于golang 中的 nil的场景分析的文章就介绍到这了,更多相关golang 中的 nil内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
Golang错误处理最让人头疼的问题就是代码里充斥着「iferr!=nil」,它们破坏了代码的可读性,本文收集了几个例子,让大家明白如何优化此类问题。让我们看看
golang里出现多goroutine的场景很常见,最常用的两种方式就是WaitGroup和Context,今天我们了解一下Context的应用场景使用场景场景
女主宣言今天小编为大家分享一篇关于Golang循环汇编分析的文章,文章中介绍了golang循环的汇编层面的处理,通过分析,我们可以更了解循环的实现。希望能对大家
针对Golang1.9的sync.RWMutex进行分析,与Golang1.10基本一样除了将panic改为了throw之外其他的都一样。RWMutex是读写互
golang.org/x包放到了https://github.com/golang/text中,下载时需要先在本地建立golang.org/x的目录后,再下载。