佳木斯湛栽影视文化发展公司

主頁(yè) > 知識(shí)庫(kù) > golang 中的 nil的場(chǎng)景分析

golang 中的 nil的場(chǎng)景分析

熱門標(biāo)簽:呼叫中心市場(chǎng)需求 網(wǎng)站排名優(yōu)化 百度競(jìng)價(jià)排名 地方門戶網(wǎng)站 服務(wù)外包 鐵路電話系統(tǒng) AI電銷 Linux服務(wù)器

源碼中的 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 可以理解為這些類型的零值,聲明一個(gè)變量在沒(méi)有賦值的情況下,變量處于零值狀態(tài)。

場(chǎng)景一

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 剛開(kāi)始沒(méi)有類型,而 p 是有類型,所以 p 和 i 都等于 nil,但是 == 可以理解為 php 或者 js 里面的 === 全等,既要類型相等,也要值相等。

在 i = p 之后,p 和 i 類型和值保持了一致所以會(huì)相等,但是 i 已經(jīng)不等于 nil 了,因?yàn)?nil 是 interface 的 0 值,或者說(shuō) i 已經(jīng)指向 p ,i 現(xiàn)在是個(gè)有類型狀態(tài)而非 0 值狀態(tài)。

結(jié)果如下

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>

場(chǎng)景二

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 里面,被轉(zhuǎn)成 interface,這個(gè) interface 是有類型的 interface,相當(dāng)于賦值了一下 i=a ,所以 i 的狀態(tài)不是 interface 的零值狀態(tài) ,和 interface 零值狀態(tài)的 nil 當(dāng)然是不相等

場(chǎng)景三

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 會(huì)拋錯(cuò) struct 不能和 nil 進(jìn)行比較
 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
}

結(jié)構(gòu)體的 0 值為 {}

到此這篇關(guān)于golang 中的 nil的場(chǎng)景分析的文章就介紹到這了,更多相關(guān)golang 中的 nil內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • golang interface判斷為空nil的實(shí)現(xiàn)代碼
  • Golang::slice和nil的對(duì)比分析
  • golang:json 反序列化的[]和nil操作
  • 徹底理解golang中什么是nil

標(biāo)簽:黃山 崇左 仙桃 蘭州 湖南 湘潭 銅川 衡水

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《golang 中的 nil的場(chǎng)景分析》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    聊城市| 丰镇市| 崇义县| 开化县| 宜都市| 海伦市| 普洱| 奇台县| 峨眉山市| 丰顺县| 南通市| 海伦市| 西安市| 成武县| 昌吉市| 顺昌县| 罗平县| 临猗县| 博罗县| 盐亭县| 名山县| 彭水| 开原市| 武夷山市| 商水县| 邻水| 青田县| 荥阳市| 大方县| 文登市| 鹤山市| 苏州市| 历史| 岑溪市| 婺源县| 伊宁市| 揭东县| 长白| 磐石市| 准格尔旗| 瓦房店市|