最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

前段時間分享了《Go 將增加內(nèi)置的零值標(biāo)識符 zero!》的新預(yù)定義標(biāo)識符 zero

對應(yīng)的簽名如下:

//?zero?is?a?predeclared?identifier?representing?the?zero?value
//?for?array?and?struct?types.
var?zero?Type

我原想著還是一個有一點點新改變。不過綜合大家意見來看,由于只是針對數(shù)組(array)和結(jié)構(gòu)體(struct),許多同學(xué)表示這個是比較雞肋的。因為仍然無法很好的解決 Go 零值和空值的識別問題,大失所望。

本文是對零值和空值判斷現(xiàn)狀進(jìn)行梳理和分享。

快速復(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)行空值判斷

在實際的 Go 業(yè)務(wù)應(yīng)用中,我們需要對數(shù)據(jù)的零值和空值進(jìn)行區(qū)分,以便于實現(xiàn)一些空值的業(yè)務(wù)邏輯處理。(初入門的同學(xué)經(jīng)常在此踩坑)

常見的有兩種做法。如下:

  • 在變量聲明時,使用指針來處理,將其聲明為指針類型。
  • 在定義變量缺省值時,錯開類型的零值。例如:int 零值是 0,業(yè)務(wù)里字段缺省值定義為 1 和 2 等。

第一種是用的最多的,也是前文評論區(qū)大家有所提到的。對于基礎(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)腦子了。

對于復(fù)合類型,也是一樣的:

var?a?[]int
var?b?map[string]int
var?g?chan?int
var?c?*[7]int
var?d?*int
var?p?*Person

對于復(fù)合類型的一些值類型,由于零值有可能是程序賦的值,也有可能是真空值。因此同樣需要加上指針,用于識別空值和零值。

在 Go 業(yè)務(wù)程序上,大家為了解決這個零值和空值的判別問題。會采取上述類似的方式去編寫包和程序。

如下演示代碼:

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>}

以此就可以實現(xiàn)空值和零值的有效區(qū)分,不再為此判別煩惱太多。

但也引入了一個麻煩的點,就是在獲取值時需要使用 *p.Name 的方式。如果希望 “屏蔽” 這個用法,一般還會再做一次函數(shù)封裝作為 Getter 的方法。

新增 zero 解決什么問題

顯然我再回去看即將新加入的 zero 標(biāo)識符時,會發(fā)現(xiàn)他能夠成功 Go 的機(jī)緣是對零值的比較判斷,而并非空值的原因。

zero 使用場景是:

if?val?==?zero(MyType)?{}

又或是:

func?example[T?any]()?T?{
??//?do?something?that?returns?an?error...
??if?err?!=?nil?{
????return?zero(T)
??}
??//...
}

這么一梳理,發(fā)現(xiàn)確實和我們想象中的有一定的差距。因為我們在實際的零值和空值的判斷中,更需要的是對內(nèi)部字段的數(shù)值判斷例如:結(jié)構(gòu)體里的某些字段,比較少是只對結(jié)構(gòu)體本身做空值判斷。

總結(jié)

今天根據(jù)大家熱議的反饋,重新梳理了 Go 中零值和空值的現(xiàn)狀和判斷技巧。感覺本次 zero 的加入,真的是只加強(qiáng)了結(jié)構(gòu)體和數(shù)組類型本身的零值判斷,而沒有針對空值的好手段。

綜合來看,考慮到規(guī)范(SPEC)中零值是官方的規(guī)范約定,改變的可能性也很低了。個人感覺核心團(tuán)隊新增判別方式或優(yōu)化的可能性比較低。

到此這篇關(guān)于淺析Go中關(guān)于零值和空值判斷的問題的文章就介紹到這了,更多相關(guān)Go零值空值內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go語言七篇入門教程二程序結(jié)構(gòu)與數(shù)據(jù)類型

    Go語言七篇入門教程二程序結(jié)構(gòu)與數(shù)據(jù)類型

    這篇文章主要為大家介紹了Go語言的程序結(jié)構(gòu)與數(shù)據(jù)類型,本篇文章是Go語言七篇入門系列文,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-11-11
  • golang三元表達(dá)式的使用方法

    golang三元表達(dá)式的使用方法

    這篇文章主要介紹了golang三元表達(dá)式的使用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • go語言實現(xiàn)字符串與其它類型轉(zhuǎn)換(strconv包)

    go語言實現(xiàn)字符串與其它類型轉(zhuǎn)換(strconv包)

    strconv包是Go語言標(biāo)準(zhǔn)庫的一部分,主要提供字符串與基本數(shù)據(jù)類型之間的轉(zhuǎn)換功能,使用strconv包可以方便地在不同類型之間進(jìn)行轉(zhuǎn)換,滿足日常編程中的需求,感興趣的可以了解一下
    2024-10-10
  • Golang實現(xiàn)內(nèi)網(wǎng)穿透詳解

    Golang實現(xiàn)內(nèi)網(wǎng)穿透詳解

    這篇文章主要為大家詳細(xì)介紹了Golang實現(xiàn)內(nèi)網(wǎng)穿透的相關(guān)知識,包括原理和代碼實現(xiàn),文中的示例代碼講解詳細(xì),有需要的小伙伴可以參考一下
    2024-11-11
  • go install/build生成的文件命名和路徑操作

    go install/build生成的文件命名和路徑操作

    這篇文章主要介紹了go install/build生成的文件命名和路徑操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Jenkins+K8s實現(xiàn)Go后端服務(wù)自動化部署教程

    Jenkins+K8s實現(xiàn)Go后端服務(wù)自動化部署教程

    本文詳細(xì)介紹了使用Jenkins和Kubernetes(K8s)實現(xiàn)Go后端服務(wù)的自動化部署流程,涵蓋前期環(huán)境準(zhǔn)備、Jenkins流水線配置、K8s資源編排、部署驗證、常見問題排查以及相關(guān)技術(shù)拓展和優(yōu)化建議,旨在提升開發(fā)和運維效率,保障服務(wù)的高可用性
    2026-04-04
  • docker如何安裝部署golang應(yīng)用程序

    docker如何安裝部署golang應(yīng)用程序

    這篇文章主要為大家介紹了docker如何安裝部署golang應(yīng)用程序詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • 詳解Golang中日志庫glog的使用

    詳解Golang中日志庫glog的使用

    golang/glog?是?C++?版本?google/glog?的?Go?版本實現(xiàn),基本實現(xiàn)了原生?glog?的日志格式,下面大家就跟隨小編一起了解一下glog的具體使用吧
    2023-09-09
  • Go語言入門exec的基本使用示例

    Go語言入門exec的基本使用示例

    這篇文章主要為大家介紹了Go語言入門exec在go語言中的基本使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • GoLang中的timer定時器實現(xiàn)原理分析

    GoLang中的timer定時器實現(xiàn)原理分析

    Timer中對外暴露的只有一個channel,這個 channel也是定時器的核心。當(dāng)計時結(jié)束時,Timer會發(fā)送值到channel中,外部環(huán)境在這個 channel 收到值的時候,就代表計時器超時了,可與select搭配執(zhí)行一些超時邏輯
    2023-02-02

最新評論

绥德县| 民权县| 星座| 山东省| 广东省| 阿鲁科尔沁旗| 个旧市| 徐闻县| 武宁县| 武陟县| 夏河县| 姚安县| 安丘市| 昌平区| 黔江区| 襄汾县| 厦门市| 纳雍县| 邢台市| 顺昌县| 会东县| 普兰县| 宁晋县| 墨江| 霍邱县| 内乡县| 广州市| 长沙市| 察雅县| 新和县| 抚宁县| 武宣县| 大悟县| 二连浩特市| 晋中市| 湟源县| 湖南省| 峨山| 双流县| 蛟河市| 耿马|