欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺析Go中關(guān)于零值和空值判斷的問題

 更新時(shí)間:2023年08月23日 14:27:54   作者:腦子進(jìn)煎魚了  
這篇文章主要是對(duì)零值和空值判斷現(xiàn)狀進(jìn)行簡(jiǎn)單的梳理和分享,文中的示例代碼講解詳細(xì),對(duì)我們深入了解go語言有一定的幫助,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

前段時(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ì)過程

    這篇文章主要介紹了在Colaboratory上運(yùn)行Go程序,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • Go語言小白入門刷題打印輸出沙漏

    Go語言小白入門刷題打印輸出沙漏

    這篇文章主要介紹了Go語言刷題打印輸出沙漏的示例過程詳解,非常適合剛?cè)腴TGo語言的小白學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-11-11
  • Go語言單例模式詳解

    Go語言單例模式詳解

    本文主要介紹了Go語言單例模式詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Golang表示枚舉類型的詳細(xì)講解

    Golang表示枚舉類型的詳細(xì)講解

    go 語言枚舉類型是這么用的?在什么場(chǎng)景下會(huì)用到枚舉?本文對(duì) go 語言枚舉做了詳細(xì)講解,感興趣的朋友跟隨小編一起看看吧
    2021-09-09
  • Go語言實(shí)現(xiàn)并發(fā)控制的常見方式詳解

    Go語言實(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)單的無界資源池

    本文我們希望通過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-05
  • Golang實(shí)現(xiàn)Json分級(jí)解析及數(shù)字解析實(shí)踐詳解

    Golang實(shí)現(xiàn)Json分級(jí)解析及數(shù)字解析實(shí)踐詳解

    你是否遇到過在無法準(zhǔn)確確定json層級(jí)關(guān)系的情況下對(duì)json進(jìn)行解析的需求呢?本文就來和大家介紹一次解析不確定的json對(duì)象的經(jīng)歷,以及遇到的問題和解決方法
    2023-02-02
  • go面向?qū)ο蠓绞讲僮鱆SON庫(kù)實(shí)現(xiàn)四則運(yùn)算

    go面向?qū)ο蠓绞讲僮鱆SON庫(kù)實(shí)現(xiàn)四則運(yùn)算

    這篇文章主要為大家介紹了go面向?qū)ο蠓绞讲僮鱆SON庫(kù)實(shí)現(xiàn)四則運(yùn)算的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • Golang使用panic控制程序錯(cuò)誤流程

    Golang使用panic控制程序錯(cuò)誤流程

    這篇文章主要介紹了Golang使用panic控制程序錯(cuò)誤流程,Golang panic異常處理機(jī)制中的一種流程控制方式,用于中斷程序流程并觸發(fā)異常處理
    2023-04-04
  • golang實(shí)現(xiàn)瀏覽器導(dǎo)出excel文件功能

    golang實(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

最新評(píng)論