国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Go 將增加內置的零值標識符 zero!

開發 前端
雖然在使用上,做了一定的使用場景的切分,也就是只有數組和結構體類型使用 zero 標識符。但對于寫 Go 用戶而言,認知上是會存在明確混淆的。以后你給其他同學解釋零值,解釋起得區分兩種場景來介紹。我感覺還不如 zero 標識符一統零值天下。但很可惜,本次提案暫時并沒有這個計劃。

大家好,我是煎魚。

大家學習和使用 Go 語言時,有一個神奇的概念:零值(zero-values)。零值這個名字是具體誰起的,又是從哪里先開始喊起的,已經難以考究了。

每次有新同學剛開始轉語言,工程上總會提到這個,想要試圖改變零值。又或是沒考慮到,一旦程序用了 0 作為 default 值,又要兼容零值的問題。

今天給大家分享一個關于零值的新提案,目測已經八九不離十了(在發布此文時,該提案已被正式 accepted)。

圖片圖片

快速復習零值

基礎類型的例子如下:

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

輸出結果:

0 0 false ""

復合類型的例子如下:

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

輸出結果:

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

類型和零值的映射表格如下:

數據類型

零值

int, int8, int16, int32, int64

0


uint, uint8, uint16, uint32, uint64

0

uintptr

0

float32, float64

0

byte

0

rune

0

string

"" (empty string)

complex64, complex128

(0,0i)

arrays of non-nillable types

array of zero-values

arrays of nillable types

array of nil-values

新提案:預聲明標識符 zero

背景

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

圖片圖片

他表示:Go 語言目前提供了幾種獲取類型零值的方法,如果能有一種統一的方法來實現這一點,代碼的可讀性會更高。

有同學深思,哪來的幾種?其實可以:

var z MyType
return z

還可以:

return *new(MyType)

初始化結構體后出來的都是零值。

緊接著就會遇到開頭提到的問題,你怎么知道這是零值,還是缺省值?難以直接判別。

更重要的是,這不太符合 Go 的設計哲學,又是多種途徑,還和缺省值產生混淆。顯然和主打工程的 Go 的發展路子不合。

解決方案

新增 zero 標識符

這次經過一番撕扯,最終是由 Go 核心團隊負責人 @Russ Cox 出來主持大局,提出了新提案并一路向前。

圖片圖片

Go 將會增加一個新的預定義標識符 zero,它是一個無類型的零值,適用于數組和結構體類型。

以下是 zero 的類型簽名:

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

他不會像 nil 一樣。我們可以對照看看 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 受限于 chan、func、interface、map、slice、pointer 等類型。

zero 可賦值性規則

zero 的可賦值性規則如下:

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

可能會有的同學擔心,zero 和短零(0, "", or nil)產生沖突。對此可以放心。在設計的規則上:zero 在短零有效的任何地方都無效,所以在使用上不會產生混淆。

解決了什么問題

實際問題上,解決了以下幾點:

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

通用概念來講:

  • 零值是 Go 中的一個重要概念。但某些類型對此還沒有具體的名稱,現在可以叫他 zero。
  • Go 需要一個機制來將其值和零值進行比較,來解決前文提到的缺省值和零值無法很好識別的問題。

一些問題和爭論

會有同學認為,現有的 return _, _, err 會比 return zero, zero, err 更短并且感覺更好。(但在清晰程度上會不如 zero 和 nil)

也有同學會認為自己寫一個這個實現也很簡單,是否有必要為此專門增加一個 zero 預定義值?

可以用泛型如下實現:

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

對此在很多提案上,都很容易陷入怪圈。有了泛型后,照實現來講,什么都可以自己寫一份。

也會有一派認為以后判斷錯誤類型要變成:

if err != zero {
  ...
}

會非常奇怪。以后可能會出現 if err != nil 和 if err != zero 的奇怪代碼場景。

注:這個場景是假定 zero 標識符能適用于所有的數據類型下才會出現。本次并不存在。

總結

目前的社區討論比較發散,認為 zero 標識符未來也可以取代所有的零值。但從提案內容和提交的 SPEC CL 來看,@Russ Cox 一直針對的是數組和結構體的零值場景去使用 zero 標識符。

這個提案已經進入到最終階段,已經被正式接受,基本跑不了了。

圖片圖片

以后我們在不同類型下對零值判斷,可以基于:

數據類型

使用什么作為零值

int 等數字類型

使用 0

string 字符串類型

使用 ”“(空字符串)

slice, map, function, pointer, channel, and interface 等類型

使用 nil

array 和 struct 類型

可使用 zero 標識符

雖然在使用上,做了一定的使用場景的切分,也就是只有數組和結構體類型使用 zero 標識符。但對于寫 Go 用戶而言,認知上是會存在明確混淆的。

以后你給其他同學解釋零值,解釋起得區分兩種場景來介紹。我感覺還不如 zero 標識符一統零值天下。但很可惜,本次提案暫時并沒有這個計劃。

參考資料

[1]proposal: builtin: zero function: https://github.com/golang/go/issues/60695

[2]cmp: add Or: https://github.com/golang/go/issues/60204#issuecomment-1550369151

責任編輯:武曉燕 來源: 腦子進煎魚了
相關推薦

2025-01-26 10:35:42

Go語言類型

2009-09-23 10:41:10

對象標識符Hibernate

2012-02-08 14:01:18

HibernateJava

2009-08-26 14:01:18

C#標識符

2024-06-05 08:47:20

Go語言方式

2022-07-17 06:57:02

時間戳唯一標識符

2009-10-27 14:20:37

VB.NET動態標識符

2009-07-21 12:59:25

Scala標識符

2017-04-21 12:30:45

AndroidAndroid O設備標識符

2011-03-14 10:17:40

JavaScript

2023-05-28 00:09:21

2010-01-15 18:17:39

VB.NET動態標識

2009-06-26 18:07:12

JSF客戶端標識符

2009-12-08 19:29:10

PHP生成唯一標識符

2023-09-26 07:28:47

2021-09-18 10:24:08

DjangoRedis緩存后端

2024-05-09 08:00:00

2025-11-18 02:00:00

2023-03-13 10:01:27

Java注釋

2009-07-09 17:02:04

JDK學習筆記數據類型
點贊
收藏

51CTO技術棧公眾號

www.一区| 欧美激情国产日韩精品一区18| a成人v在线| 超碰在线中文| 全部孕妇毛片丰满孕妇孕| 欧美日韩精品免费| 中文另类视频| 亚洲日本中文字幕区| 自拍偷拍亚洲综合| 国产成人精品免费看在线播放 | 欧美黑人经典片免费观看| 国产一区二区精品| 1卡2卡3卡精品视频| 欧洲杯半决赛直播| 91av福利视频| 大香伊人久久精品一区二区| 亚洲人成自拍网站| 亚洲优女在线| 日韩激情av在线播放| 成年网站在线视频网站| 亚洲国产美女精品久久久久∴| www在线免费观看视频| 91精品国产综合久久精品性色| 麻豆视频网站在线观看| 88在线观看91蜜桃国自产| 精品176二区| 5月丁香婷婷综合| a篇片在线观看网站| 欧美日韩电影在线播放| 免费看美女隐私的视频| 亚洲无线码一区二区三区| 最近2018中文字幕免费在线视频| 亚洲综合色自拍一区| 日韩日韩日韩日韩| 一区二区不卡在线视频 午夜欧美不卡在| 黄色av地址| 精品日本美女福利在线观看| 欧洲亚洲在线| 日韩欧美第一区| 国模冰冰炮一区二区| 精品国产一区二区在线 | 国产精品va在线观看无码| 成人动漫视频在线| av片在线免费| 亚洲一区二区三区免费视频| 91亚洲天堂| 国产香蕉97碰碰久久人人| 欧美好骚综合网| 欧美日韩另类一区| 女同视频在线观看| 久久精品国产精品亚洲| 天堂99x99es久久精品免费| 亚洲一区国产精品| 美洲天堂一区二卡三卡四卡视频| 大陆av在线播放| 亚洲精品久久久久久国产精华液| 国产在线免费观看| 亚洲精选一区二区| 亚洲国产精品嫩草影院久久av| 超碰97在线资源| 国产精品99久久久| 一级黄色av| 亚洲高清福利视频| 高潮久久久久久久久久久久久久| 99中文字幕| 成人av在线观| 天堂v视频永久在线播放| 精品小视频在线| 精品日韩欧美一区| 国产又爽又黄ai换脸| 亚洲免费av在线| 国产99re66在线视频| 欧美一区第一页| 免费观看在线色综合| 国产黄色免费电影| 欧美激情国产在线| 婷婷六月天在线| 亚洲综合丝袜美腿| 国产经典三级在线| 欧美极品xxxx| 一区二区三区四区五区精品视频| 国产精品久久久久久久久电影网| 亚洲国产另类av| 久久夜夜操妹子| 91免费精品视频| 成人av综合在线| 唐人社导航福利精品| 成人中文字幕+乱码+中文字幕| 国产高清自产拍av在线| 97精品伊人久久久大香线蕉| 99成人在线| 日韩精品一区二区三区在线| 国产在线|日韩| 人人妻人人添人人爽欧美一区| 中文字幕一区二| 美女航空一级毛片在线播放| 欧美一区二区三区免费视| 日韩av午夜在线观看| 国产69精品久久久久孕妇| 亚洲欧美日韩一区二区三区在线| 精品一区电影| 黄色网页免费在线观看| 在线播放亚洲一区| 国产一区二区三区91| 9久久9毛片又大又硬又粗| 91精品黄色片免费大全| 精品在线91| 亚洲中文字幕无码不卡电影| 日韩欧美一二区| 午夜日韩在线| 亚欧黄色av| 久久久久久九九九| 风流少妇一区二区| 午夜激情在线| 国产精品18毛片一区二区| 亚洲精品美腿丝袜| 视频欧美一区| 精品无码一区二区三区爱欲| 日韩三级av在线播放| 国产精品xvideos88| 久草在线新资源| 日本不卡视频在线播放| 成人免费视频视频| 小视频免费在线观看| 麻豆av一区二区| 欧美色倩网站大全免费| 精品视频亚洲| 色偷偷亚洲女人天堂观看欧| 久久91超碰青草是什么| av一二三不卡影片| a成人v在线| 成人免费观看cn| 一本色道久久综合狠狠躁篇怎么玩 | 电影av在线| 亚洲精品一区二区毛豆| 色激情天天射综合网| 1024日韩| 欧美激情第一页在线观看| 亚洲国产欧美在线| 神马久久一区二区三区| 羞羞免费视频网站| 欧美一级高清免费| 中文字幕精品三区| 99亚洲乱人伦aⅴ精品| 欧美三级理论片| 日韩av免费一区| 午夜视频一区二区| 欧美精品午夜| √天堂8在线网| 免费在线精品视频| 久久躁狠狠躁夜夜爽| 中文字幕av一区二区三区免费看| 欧美男人操女人视频| 国产精品久久久久久精| 国产精品一区二区三区久久 | 黄视频免费在线看| 欧美日韩一区二区三区电影| 国产亚洲一区二区在线| 久久欧美中文字幕| 国产va免费精品观看精品视频| 久久99国产精品麻豆| 国产精品久久色| 午夜精彩视频在线观看不卡| 四季av在线一区二区三区| 午夜成在线www| 久久爱www.| 老司机深夜福利在线观看| 日韩av在线电影观看| 亚洲精品在线观看视频| 国产精品 日产精品 欧美精品| 伊人久久综合网另类网站| 992tv在线观看在线播放| 黄色影院在线播放| 91久久久久久久一区二区| 日本高清不卡视频| 免费欧美日韩国产三级电影| 国模私拍国内精品国内av| 国产又黄又猛视频| 成人网页在线免费观看| 精品精品国产高清a毛片牛牛| 99久久国产综合精品女不卡| 久久av导航| 宅男网站在线免费观看| 国产l精品国产亚洲区久久| 国产精品偷伦免费视频观看的| 日韩欧美综合在线| 91影院在线免费观看| 91精品国产乱码久久久久久| 亚洲成人自拍偷拍| 亚洲一区精品在线| 亚洲一区在线视频| 一区二区高清| 99久久亚洲国产日韩美女 | jizz内谢中国亚洲jizz| 992tv在线观看在线播放| 国产精品久久色| 日韩av在线一区二区| 亚洲免费观看在线观看| 久久精品久久久精品美女| 久久午夜影院|