淺析Go中關(guān)于零值和空值判斷的問題
前段時(shí)間分享了《Go 將增加內(nèi)置的零值標(biāo)識(shí)符 zero!》的新預(yù)定義標(biāo)識(shí)符 zero
。
對(duì)應(yīng)的簽名如下:
//?zero?is?a?predeclared?identifier?representing?the?zero?value //?for?array?and?struct?types. var?zero?Type
我原想著還是一個(gè)有一點(diǎn)點(diǎn)新改變。不過綜合大家意見來看,由于只是針對(duì)數(shù)組(array)和結(jié)構(gòu)體(struct),許多同學(xué)表示這個(gè)是比較雞肋的。因?yàn)槿匀?strong>無法很好的解決 Go 零值和空值的識(shí)別問題,大失所望。
本文是對(duì)零值和空值判斷現(xiàn)狀進(jìn)行梳理和分享。
快速?gòu)?fù)習(xí)零值
基本類型
var?a?int var?b?bool var?c?string func?main()?{ ?fmt.Printf("%+v\n",?a)?//?0 ?fmt.Printf("%+v\n",?b)?//?false ?fmt.Printf("%+v\n",?c)?//?"" }
復(fù)合類型
var?a?[]int var?b?map[string]int var?c?[7]int var?d?*int var?g?chan?int var?p?Person type?Person?struct?{ ?Name?string ?Age??int } func?main()?{ ?fmt.Printf("%+v\n",?a)?//?[] ?fmt.Printf("%+v\n",?b)?//?map[] ?fmt.Printf("%+v\n",?c)?//?[0?0?0?0?0?0?0] ?fmt.Printf("%+v\n",?d)?//?<nil> ?fmt.Printf("%+v\n",?g)?//?<nil> ?fmt.Printf("%+v\n",?p)?//?{Name:?Age:0} }
進(jìn)行空值判斷
在實(shí)際的 Go 業(yè)務(wù)應(yīng)用中,我們需要對(duì)數(shù)據(jù)的零值和空值進(jìn)行區(qū)分,以便于實(shí)現(xiàn)一些空值的業(yè)務(wù)邏輯處理。(初入門的同學(xué)經(jīng)常在此踩坑)
常見的有兩種做法。如下:
- 在變量聲明時(shí),使用指針來處理,將其聲明為指針類型。
- 在定義變量缺省值時(shí),錯(cuò)開類型的零值。例如:int 零值是 0,業(yè)務(wù)里字段缺省值定義為 1 和 2 等。
第一種是用的最多的,也是前文評(píng)論區(qū)大家有所提到的。對(duì)于基礎(chǔ)類型,具體的代碼示例如下:
var?a?*int var?b?*bool var?c?*string func?main()?{ ?if?a?==?nil?{ ??fmt.Print("煎魚") ?} ?if?b?==?nil?{ ??fmt.Print("進(jìn)") ?} ?if?c?==?nil?{ ??fmt.Print("腦子了") ?} }
輸出結(jié)果:煎魚進(jìn)腦子了。
對(duì)于復(fù)合類型,也是一樣的:
var?a?[]int var?b?map[string]int var?g?chan?int var?c?*[7]int var?d?*int var?p?*Person
對(duì)于復(fù)合類型的一些值類型,由于零值有可能是程序賦的值,也有可能是真空值。因此同樣需要加上指針,用于識(shí)別空值和零值。
在 Go 業(yè)務(wù)程序上,大家為了解決這個(gè)零值和空值的判別問題。會(huì)采取上述類似的方式去編寫包和程序。
如下演示代碼:
type?Person?struct?{ ?Name?*string ?Age??*int } func?main()?{ ?s?:=?`{ ??"name":?"煎魚" ?}` ?var?p?Person ?err?:=?json.Unmarshal([]byte(s),?&p) ?if?err?!=?nil?{ ??fmt.Println(err) ?} ?fmt.Printf("p:?%+v\n",?p) ?fmt.Println(*p.Name) }
輸出結(jié)果:
p: {Name:0xc00010c380 Age:<nil>}
煎魚
可以看到所傳入的 json 字符串并不包含 age 字段,因此其值為 nil。
如果是為空字符串:
s?:=?`{ ??"name":?"" ?}`
解析后輸出的結(jié)果為:
p: {Name:0xc000096380 Age:<nil>}
以此就可以實(shí)現(xiàn)空值和零值的有效區(qū)分,不再為此判別煩惱太多。
但也引入了一個(gè)麻煩的點(diǎn),就是在獲取值時(shí)需要使用 *p.Name
的方式。如果希望 “屏蔽” 這個(gè)用法,一般還會(huì)再做一次函數(shù)封裝作為 Getter 的方法。
新增 zero 解決什么問題
顯然我再回去看即將新加入的 zero
標(biāo)識(shí)符時(shí),會(huì)發(fā)現(xiàn)他能夠成功 Go 的機(jī)緣是對(duì)零值的比較判斷,而并非空值的原因。
zero 使用場(chǎng)景是:
if?val?==?zero(MyType)?{}
又或是:
func?example[T?any]()?T?{ ??//?do?something?that?returns?an?error... ??if?err?!=?nil?{ ????return?zero(T) ??} ??//... }
這么一梳理,發(fā)現(xiàn)確實(shí)和我們想象中的有一定的差距。因?yàn)槲覀冊(cè)趯?shí)際的零值和空值的判斷中,更需要的是對(duì)內(nèi)部字段的數(shù)值判斷例如:結(jié)構(gòu)體里的某些字段,比較少是只對(duì)結(jié)構(gòu)體本身做空值判斷。
總結(jié)
今天根據(jù)大家熱議的反饋,重新梳理了 Go 中零值和空值的現(xiàn)狀和判斷技巧。感覺本次 zero 的加入,真的是只加強(qiáng)了結(jié)構(gòu)體和數(shù)組類型本身的零值判斷,而沒有針對(duì)空值的好手段。
綜合來看,考慮到規(guī)范(SPEC)中零值是官方的規(guī)范約定,改變的可能性也很低了。個(gè)人感覺核心團(tuán)隊(duì)新增判別方式或優(yōu)化的可能性比較低。
到此這篇關(guān)于淺析Go中關(guān)于零值和空值判斷的問題的文章就介紹到這了,更多相關(guān)Go零值空值內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在Colaboratory上運(yùn)行Go程序的詳細(xì)過程
這篇文章主要介紹了在Colaboratory上運(yùn)行Go程序,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08Go語言實(shí)現(xiàn)并發(fā)控制的常見方式詳解
這篇文章主要為大家詳細(xì)介紹了Go語言實(shí)現(xiàn)并發(fā)控制的幾種常見方式,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考一下2024-03-03使用Go語言實(shí)現(xiàn)一個(gè)簡(jiǎn)單的無界資源池
本文我們希望通過go語言實(shí)現(xiàn)一個(gè)簡(jiǎn)單的資源池,而這個(gè)資源池的資源包括但不限于數(shù)據(jù)庫(kù)連接池,線程池,協(xié)程池,網(wǎng)絡(luò)連接池,只要這些資源實(shí)現(xiàn)我們指定的關(guān)閉方法,則都可以通過我們封裝的資源池進(jìn)行統(tǒng)一管理,文中通過代碼示例給大家介紹的非常詳細(xì),需要的朋友可以參考下2024-05-05Golang實(shí)現(xiàn)Json分級(jí)解析及數(shù)字解析實(shí)踐詳解
你是否遇到過在無法準(zhǔn)確確定json層級(jí)關(guān)系的情況下對(duì)json進(jìn)行解析的需求呢?本文就來和大家介紹一次解析不確定的json對(duì)象的經(jīng)歷,以及遇到的問題和解決方法2023-02-02go面向?qū)ο蠓绞讲僮鱆SON庫(kù)實(shí)現(xiàn)四則運(yùn)算
這篇文章主要為大家介紹了go面向?qū)ο蠓绞讲僮鱆SON庫(kù)實(shí)現(xiàn)四則運(yùn)算的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07golang實(shí)現(xiàn)瀏覽器導(dǎo)出excel文件功能
這篇文章主要介紹了golang實(shí)現(xiàn)瀏覽器導(dǎo)出excel文件功能,文章通過golang導(dǎo)出excel文件返回給web,實(shí)現(xiàn)瀏覽器導(dǎo)出excel文件功能,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-03-03