亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Go內(nèi)置零值標(biāo)識(shí)符zero

 更新時(shí)間:2023年08月23日 14:23:39   作者:腦子進(jìn)煎魚(yú)了  
大家學(xué)習(xí)和使用?Go?語(yǔ)言時(shí),有一個(gè)神奇的概念:零值(zero-values),所以本文想給大家分享一個(gè)關(guān)于零值的新提案,目測(cè)已經(jīng)八九不離十了

大家學(xué)習(xí)和使用 Go 語(yǔ)言時(shí),有一個(gè)神奇的概念:零值(zero-values)。零值這個(gè)名字是具體誰(shuí)起的,又是從哪里先開(kāi)始喊起的,已經(jīng)難以考究了。

每次有新同學(xué)剛開(kāi)始轉(zhuǎn)語(yǔ)言,工程上總會(huì)提到這個(gè),想要試圖改變零值。又或是沒(méi)考慮到,一旦程序用了 0 作為 default 值,又要兼容零值的問(wèn)題。

今天給大家分享一個(gè)關(guān)于零值的新提案,目測(cè)已經(jīng)八九不離十了(在發(fā)布此文時(shí),該提案已被正式 accepted)。

快速?gòu)?fù)習(xí)零值

基礎(chǔ)類(lèi)型的例子如下:

func?main()?{
?var?i?int
?var?f?float64
?var?b?bool
?var?s?string
?fmt.Printf("%v?%v?%v?%q\n",?i,?f,?b,?s)
}

輸出結(jié)果:

0 0 false ""

復(fù)合類(lèi)型的例子如下:

type?Person?struct?{
?Name???string
?Age????int
?Weight?float64
}
func?main()?{
?var?p?Person
?var?m?map[int]string
?var?s?[]string
?fmt.Printf("%#v\n%#v\n%#v\n",?p,?m,?s)
}

輸出結(jié)果:

main.Person{Name:"", Age:0, Weight:0}
map[int]string(nil)
[]string(nil)

類(lèi)型和零值的映射表格如下:

數(shù)據(jù)類(lèi)型零值
int, int8, int16, int32, int640
uint, uint8, uint16, uint32, uint640
uintptr0
float32, float640
byte0
rune0
string"" (empty string)
complex64, complex128(0,0i)
arrays of non-nillable typesarray of zero-values
arrays of nillable typesarray of nil-values

新提案:預(yù)聲明標(biāo)識(shí)符 zero

背景

事情的起因是:@Nathan Cormier 在社區(qū)提了吐槽和提案《proposal: builtin: zero function[1]》:

他表示:Go 語(yǔ)言目前提供了幾種獲取類(lèi)型零值的方法,如果能有一種統(tǒng)一的方法來(lái)實(shí)現(xiàn)這一點(diǎn),代碼的可讀性會(huì)更高。

有同學(xué)深思,哪來(lái)的幾種?其實(shí)可以:

var?z?MyType
return?z

還可以:

return?*new(MyType)

初始化結(jié)構(gòu)體后出來(lái)的都是零值。

緊接著就會(huì)遇到開(kāi)頭提到的問(wèn)題,你怎么知道這是零值,還是缺省值?難以直接判別。

更重要的是,這不太符合 Go 的設(shè)計(jì)哲學(xué),又是多種途徑,還和缺省值產(chǎn)生混淆。顯然和主打工程的 Go 的發(fā)展路子不合。

解決方案

新增 zero 標(biāo)識(shí)符

這次經(jīng)過(guò)一番撕扯,最終是由 Go 核心團(tuán)隊(duì)負(fù)責(zé)人 @Russ Cox 出來(lái)主持大局,提出了新提案并一路向前。

Go 將會(huì)增加一個(gè)新的預(yù)定義標(biāo)識(shí)符 zero,它是一個(gè)無(wú)類(lèi)型的零值,適用于數(shù)組和結(jié)構(gòu)體類(lèi)型。

以下是 zero 的類(lèi)型簽名:

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

他不會(huì)像 nil 一樣。我們可以對(duì)照看看 nil 的類(lèi)型簽名:

//?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 受限于 chan、func、interface、map、slice、pointer 等類(lèi)型。

zero 可賦值性規(guī)則

zero 的可賦值性規(guī)則如下:

  • 絕大部分場(chǎng)景下,zero 可以分配給任何類(lèi)型 T 的任何變量。(T 指的是結(jié)構(gòu)體)
  • 不可以的場(chǎng)景,已經(jīng)具有短零(指的是:0、“”、nil)的變量,不可以分配。
  • 泛型場(chǎng)景下,即使 T 是帶有 any 約束條件的類(lèi)型參數(shù),也是可以分配的。
  • 上述提到的可賦值性,包含函數(shù)參數(shù)和返回值,例如:f(zero) 和 return zero, err 也是正常有效的,也能夠用于值比較。

可能會(huì)有的同學(xué)擔(dān)心,zero 和短零(0, "", or nil)產(chǎn)生沖突。對(duì)此可以放心。在設(shè)計(jì)的規(guī)則上:zero 在短零有效的任何地方都無(wú)效,所以在使用上不會(huì)產(chǎn)生混淆。

解決了什么問(wèn)題

實(shí)際問(wèn)題上,解決了以下幾點(diǎn):

  • 在通用代碼中需要引用零值,發(fā)現(xiàn)大家經(jīng)常建議使用 *new(T) 來(lái)做初始化。導(dǎo)致經(jīng)常要向新用戶解釋這一點(diǎn)非常麻煩。Go 需要更簡(jiǎn)潔的方法。
  • 在泛型代碼中便于與零值比較,在 cmp: add Or[2] 中出現(xiàn)了這一實(shí)際編碼訴求。
  • 縮短錯(cuò)誤返回,新的 return zero, err 會(huì)比原有的 return time.Time{}, err 更好。

通用概念來(lái)講:

  • 零值是 Go 中的一個(gè)重要概念。但某些類(lèi)型對(duì)此還沒(méi)有具體的名稱(chēng),現(xiàn)在可以叫他 zero。
  • Go 需要一個(gè)機(jī)制來(lái)將其值和零值進(jìn)行比較,來(lái)解決前文提到的缺省值和零值無(wú)法很好識(shí)別的問(wèn)題。

一些問(wèn)題和爭(zhēng)論

會(huì)有同學(xué)認(rèn)為,現(xiàn)有的 return _, _, err 會(huì)比 return zero, zero, err 更短并且感覺(jué)更好。(但在清晰程度上會(huì)不如 zero 和 nil)

也有同學(xué)會(huì)認(rèn)為自己寫(xiě)一個(gè)這個(gè)實(shí)現(xiàn)也很簡(jiǎn)單,是否有必要為此專(zhuān)門(mén)增加一個(gè) zero 預(yù)定義值?

可以用泛型如下實(shí)現(xiàn):

func?Zero[T?any]()?T?{
????var?v?T
????return?v
}

對(duì)此在很多提案上,都很容易陷入怪圈。有了泛型后,照實(shí)現(xiàn)來(lái)講,什么都可以自己寫(xiě)一份。

也會(huì)有一派認(rèn)為以后判斷錯(cuò)誤類(lèi)型要變成:

if?err?!=?zero?{
??...
}

會(huì)非常奇怪。以后可能會(huì)出現(xiàn) if err != nil 和 if err != zero 的奇怪代碼場(chǎng)景。

注:這個(gè)場(chǎng)景是假定 zero 標(biāo)識(shí)符能適用于所有的數(shù)據(jù)類(lèi)型下才會(huì)出現(xiàn)。本次并不存在。

總結(jié)

目前的社區(qū)討論比較發(fā)散,認(rèn)為 zero 標(biāo)識(shí)符未來(lái)也可以取代所有的零值。但從提案內(nèi)容和提交的 SPEC CL 來(lái)看,@Russ Cox 一直針對(duì)的是數(shù)組和結(jié)構(gòu)體的零值場(chǎng)景去使用 zero 標(biāo)識(shí)符。

這個(gè)提案已經(jīng)進(jìn)入到最終階段,已經(jīng)被正式接受,基本跑不了了。

以后我們?cè)诓煌?lèi)型下對(duì)零值判斷,可以基于:

數(shù)據(jù)類(lèi)型使用什么作為零值
int 等數(shù)字類(lèi)型使用 0
string 字符串類(lèi)型使用 ”“(空字符串)
slice, map, function, pointer, channel, and interface 等類(lèi)型使用 nil
array 和 struct 類(lèi)型可使用 zero 標(biāo)識(shí)符

雖然在使用上,做了一定的使用場(chǎng)景的切分,也就是只有數(shù)組和結(jié)構(gòu)體類(lèi)型使用 zero 標(biāo)識(shí)符。但對(duì)于寫(xiě) Go 用戶而言,認(rèn)知上是會(huì)存在明確混淆的。

以后你給其他同學(xué)解釋零值,解釋起得區(qū)分兩種場(chǎng)景來(lái)介紹。我感覺(jué)還不如 zero 標(biāo)識(shí)符一統(tǒng)零值天下。但很可惜,本次提案暫時(shí)并沒(méi)有這個(gè)計(jì)劃。

到此這篇關(guān)于Go內(nèi)置零值標(biāo)識(shí)符zero的文章就介紹到這了,更多相關(guān)Go零值內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go語(yǔ)言轉(zhuǎn)換所有字符串為大寫(xiě)或者小寫(xiě)的方法

    Go語(yǔ)言轉(zhuǎn)換所有字符串為大寫(xiě)或者小寫(xiě)的方法

    這篇文章主要介紹了Go語(yǔ)言轉(zhuǎn)換所有字符串為大寫(xiě)或者小寫(xiě)的方法,實(shí)例分析了ToLower和ToUpper函數(shù)的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • go語(yǔ)言中的interface使用實(shí)例

    go語(yǔ)言中的interface使用實(shí)例

    這篇文章主要介紹了go語(yǔ)言中的interface使用實(shí)例,go語(yǔ)言中的interface是一組未實(shí)現(xiàn)的方法的集合,如果某個(gè)對(duì)象實(shí)現(xiàn)了接口中的所有方法,那么此對(duì)象就實(shí)現(xiàn)了此接口,需要的朋友可以參考下
    2015-05-05
  • go原生庫(kù)的中bytes.Buffer用法

    go原生庫(kù)的中bytes.Buffer用法

    這篇文章主要介紹了go原生庫(kù)的中bytes.Buffer用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • 看看你的Go應(yīng)用是否用了正確CPU核數(shù)

    看看你的Go應(yīng)用是否用了正確CPU核數(shù)

    這篇文章主要為大家介紹了Go應(yīng)用正確的CPU核數(shù)分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • Go語(yǔ)言defer的一些神奇規(guī)則示例詳解

    Go語(yǔ)言defer的一些神奇規(guī)則示例詳解

    這篇文章主要為大家介紹了Go語(yǔ)言defer的一些神奇規(guī)則示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • Golang限流器time/rate設(shè)計(jì)與實(shí)現(xiàn)詳解

    Golang限流器time/rate設(shè)計(jì)與實(shí)現(xiàn)詳解

    在?Golang?庫(kù)中官方給我們提供了限流器的實(shí)現(xiàn)golang.org/x/time/rate,它是基于令牌桶算法(Token?Bucket)設(shè)計(jì)實(shí)現(xiàn)的,下面我們就來(lái)看看他的具體使用吧
    2024-03-03
  • Go語(yǔ)言中http和mysql的實(shí)現(xiàn)代碼

    Go語(yǔ)言中http和mysql的實(shí)現(xiàn)代碼

    本文通過(guò)實(shí)例代碼給大家介紹了Go語(yǔ)言中http和mysql的實(shí)現(xiàn)代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-11-11
  • golang中的string與其他格式數(shù)據(jù)的轉(zhuǎn)換方法詳解

    golang中的string與其他格式數(shù)據(jù)的轉(zhuǎn)換方法詳解

    這篇文章主要介紹了golang中的string與其他格式數(shù)據(jù)的轉(zhuǎn)換方法,文章通過(guò)代碼示例介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-10-10
  • Go gorilla securecookie庫(kù)的安裝使用詳解

    Go gorilla securecookie庫(kù)的安裝使用詳解

    這篇文章主要介紹了Go gorilla securecookie庫(kù)的安裝使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Go語(yǔ)言append切片添加元素的實(shí)現(xiàn)

    Go語(yǔ)言append切片添加元素的實(shí)現(xiàn)

    本文主要介紹了Go語(yǔ)言append切片添加元素的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04

最新評(píng)論