精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

關于Go錯誤處理新提案的一個想法:?操作符這樣用行不行

開發 前端
Ian Taylor在discussion中明確了該提案的目標是引入一種新語法,在不影響控制流清晰度的前提下,減少正常情況下檢查錯誤所需的代碼量。

0. 背景

Ian Taylor在關閉了旨在消除Go錯誤處理樣板代碼的issue[1]之后,又另起了一個“同名”的discussion[2]。錯誤處理真不愧是Go社區呼聲最高的問題,幾天之內又收到了近500條回復!不過到目前為止,依然沒有形成統一和高贊的意見。

關于error handling的樣板代碼過多,其實我個人是可以接受的,即便不做出任何改變也是ok的,估計Go社區與我有相同看法的也不在少數。比如就有人引用了Rob Pike的權威觀點[3],并認為Go應該按照Rob大神的思路,保持Go語法穩定:  

圖片

  不過自然也會有另外一批人強烈希望錯誤處理的樣板代碼得到改進。

Ian Taylor在discussion中明確了該提案的目標是引入一種新語法,在不影響控制流清晰度的前提下,減少正常情況下檢查錯誤所需的代碼量。  

 Ian最初的Proposal由于隱式聲明變量err以及可選代碼塊等問題而備受“批評”,并且似乎該proposal違反了他自己提出的目標。  

今天在discussion中看到一位名為Mukunda Johnson的gopher的評論[4],我覺得很有道理。其核心觀點就是:盡量保持Go的傳統語法形式。他還給出了期望中的語法示例:

// 當前錯誤處理樣板代碼過多的示例
f, err := open(file)
if err != nil {
   return err
}
defer f.Close()

if err = binwrite(f, signature); err != nil {
   return err
}
if err = binwrite(f, header); err != nil {
   return err
}
if err = binwrite(f, zeroSegment); err != nil {
   return err
}

for _, s := range segments {
   if err = binwrite(f, s); err != nil {
      return err
   }
}

if err = binwrite(f, footer); err != nil {
   return err
}

vs. 

// 使用新語法改進后的代碼
f, err := open(file)?
defer f.Close()

binwrite(f, signature)?
binwrite(f, header)?
binwrite(f, zeroSegment)?

for _, s := range segments {
   binwrite(f, s)?
}

binwrite(f, footer)?

這給了我很大啟發:我們可以引入?語法,但是如果結合原先err變量的聲明形式豈不是更好!比如:

f, err := open(file)?

豈不是要比下面兩種形式更好!

f := open(file)?

或

f := open(file)? err { }

通過僅引入一個問號(?)操作符,并避免引入過多的新語法形式,卻能解決60%的錯誤處理樣板問題。根據jba對Go開源代碼中錯誤處理的抽樣統計[5],超過60%的錯誤處理都是直接返回err,而沒有對err進行任何修飾。此外,顯式聲明err可以最大程度地避免隱式聲明帶來的問題,同時提升代碼的可讀性。

因此,基于盡量使用已有Go代碼風格、最大程度避免隱式聲明,并僅解決最常見的錯誤處理樣板代碼的原則,下面我基于Ian提案的錯誤處理改進語法,談點自己關于新?操作符使用的想法,大家看看是否可行。

1. 對于最常見的未經修飾的錯誤處理代碼

err := SomeFunction2()
if err != nil {
 return err
}

或是

if err := SomeFunction2(); err != nil {
    return err
}

我們使用下面的新語法做等價替代:

err := SomeFunction2() ?

如果聲明的錯誤變量名為err,也可省略賦值操作符左側代碼,從而簡化為:

SomeFunction2() ? // 這里略帶隱式

2. 如果函數返回值有多個,甚至有多個錯誤變量的情況

比如下面代碼:

a, b, err0, err1, err2 := SomeFunction3()
if err2 != nil {
    return err2
}

我們可以將其改寫為:

a, b, err0, err1, err2 := SomeFunction3()?

其語義是如果err2不為nil,返回err2,但前提要保證賦值語句的左側的最后一個變量err2必須是實現error接口的類型的變量。

如果是像下面這樣在err2 != nil時有多個返回值,又該如何處理呢?

a, b, err0, err1, err2 := SomeFunction3()
if err2 != nil {
    return a, b, err2
}

對于這種情況,我認為可以不在新方案的考慮范圍之內,現在怎么寫,請繼續這么寫。如果非要解決,請繼續看后面支持可選代碼塊的情況。

實現以上兩種情況,就能解決60%以上的錯誤樣板代碼問題了!

3. 對于對返回的error值進行修飾的情況

對于像下面兩種對返回的error變量進行修飾的情況:

r, err := SomeFunction()
if err != nil {
    return fmt.Errorf("something failed: %v", err)
}

if err := SomeFunction2(); err != nil {
    return fmt.Errorf("something else failed: %v", err)
}

我的第一想法是保持現狀 ,不在新方案考慮范圍之內。

不過如果非要在新方案中解決,那就需要引入可選代碼塊(optional block)了!比如:

r, err := SomeFunction() ? {
    return fmt.Errorf("something failed: %v", err)
}

err := SomeFunction2() ? {
    return fmt.Errorf("something else failed: %v", err)
}

和Ian的原proposal中語法不同,這里我們依然顯式聲明了err,當然你也可以不用err這個名字,由于是顯式聲明,你用任何名字均可,比如:

r, e := SomeFunction() ? {
    return fmt.Errorf("something failed: %v", e)
}

myErr := SomeFunction2() ? {
    return fmt.Errorf("something else failed: %v", myErr)
}

這將避免隱式聲明帶來的諸多問題!

基于可選代碼塊,我們也可以處理一下前面提到的返回多個值的情況。下面代碼

a, b, err0, err1, err2 := SomeFunction3()
if err2 != nil {
    return a, b, err2
}

可以改寫為:

a, b, err0, err1, err2 := SomeFunction3() ? {
    return a, b, err2
}

這里加入可選代碼塊后,我建議開發人員負責顯式調用return,而不是由?操作符來自動return,也就是說完全將控制權交給你。如果你沒有在可選代碼塊中調用return,那么代碼在執行完可選代碼塊中的代碼后,還會繼續向下執行。可選代碼塊相當于一個error handler,而不帶可選代碼塊的情況,默認的error handler其實就是一個return err,偽代碼類似這樣:

err := SomeFunction2() ?

<=>

err := SomeFunction2() ? {
 return err
}

這樣解釋后,你是不是覺得在語義層面,不帶可選代碼塊與帶有可選代碼塊的情況就統一和一致了呢!

本質上來說,?+可選代碼塊僅是讓你少敲了個if以及err != nil。

4. 綜合示例

Mukunda Johnson給出的示例其實已經可以很好地展示?操作符+顯式聲明err方案帶來的消除樣板代碼的效果,這里再回顧一下(這里沒用到可選代碼塊,因此代碼顯得格外清晰):

f, err := open(file)?
defer f.Close()

binwrite(f, signature)?
binwrite(f, header)?
binwrite(f, zeroSegment)?

for _, s := range segments {
   binwrite(f, s)?
}

binwrite(f, footer)?

此外,在原discussion中,另外一個gopher提出的示例,我們也可以用上面的想法改寫一下:

// 最常見的情況
SomeFunc() ?

// 多個返回值,最后一個為error變量
a, err1 := SomeFunction2() ?

// 返回前對err進行修飾
err := SomeFunc() ? {
  return fmt.Errorf("oh no: %w", err)
}

// 顯式聲明避免變量遮蔽
err := SomeFunc() ?  {
  otherErr := OtherFunc() ?  {
    err = errors.Wrap(err, otherErr) // 在可選代碼塊中沒有顯式調用return,代碼還會繼續向后執行
  }
  return fmt.Errorf("oh no: %w", err)
}

5. 小結

再來簡單總結一下上面想法中的語法形式的優勢:

  • 與傳統Go語法形式幾乎一致,盡量避免引入過多新語法形式,在不使用可選代碼塊的時候,只是多了一個問號(?)。
  • 顯式聲明err變量,最大程度避免隱式聲明帶來的問題。
  • 專注解決最常見的錯誤處理樣板情景,其他場景保持當前寫法即可。
  • 即便引入可選代碼塊,本質上與不用可選代碼塊的語法在語義層面也是統一和一致的。

這一語法方案保留了原Ian提案中的優勢,并能消除一些缺點,如變量遮蔽和隱式聲明等。不過,仍然有些原proposal中的劣勢問題無法完全消除,但這些問題顯然不是主要關注點。

需要注意的是,以上想法目前僅停留在形式討論層面,技術層面是否可行尚不確定。

大家認為我的想法可行嗎?希望大家能提出更具建設性的意見^_^。

參考資料

[1] 旨在消除Go錯誤處理樣板代碼的issue: https://github.com/golang/go/issues/71203

[2] discussion: https://github.com/golang/go/discussions/71460

[3] Rob Pike的權威觀點: https://go.dev/talks/2015/simplicity-is-complicated.slide#9

[4] Mukunda Johnson的gopher的評論: https://github.com/golang/go/discussions/71460#discussioncomment-12084482

[5] jba對Go開源代碼中錯誤處理的抽樣統計: https://github.com/golang/go/issues/71203#issuecomment-2585915103

責任編輯:武曉燕 來源: TonyBai
相關推薦

2024-06-05 08:47:20

Go語言方式

2022-07-13 08:53:28

函數Go語言

2022-09-05 08:55:15

Go2提案語法

2022-10-24 08:55:13

Go工具鏈開發者

2025-02-24 09:30:15

2021-09-27 15:33:48

Go 開發技術

2021-09-27 10:04:03

Go程序處理

2024-11-19 09:10:19

迭代器Go語言

2014-11-17 10:05:12

Go語言

2021-04-29 09:02:44

語言Go 處理

2021-09-13 07:53:31

Go錯誤處理

2020-12-17 06:25:05

Gopanic 模式

2023-03-10 08:48:29

2020-08-20 10:16:56

Golang錯誤處理數據

2022-12-12 08:53:53

Go版本方式

2013-03-18 10:31:22

JS異常

2024-02-28 08:54:57

switchGo錯誤

2020-03-03 15:42:33

Python字典合并代碼

2021-04-15 08:55:51

Go struc代碼

2025-06-06 06:45:54

點贊
收藏

51CTO技術棧公眾號

亚洲国产综合网| 中文字幕伦理片| wwww在线观看免费视频| 99re这里只有精品视频首页| 日韩av成人在线| 五月婷婷婷婷婷| 永久免费精品视频| 色中色一区二区| 国产福利片一区二区| 亚洲精品无遮挡| 久久久久看片| 伦伦影院午夜日韩欧美限制| 亚洲欧美日本一区| 日本久久二区| 欧美日韩一区二区免费视频| 在线视频不卡国产| 午夜在线观看视频18| 老司机免费视频一区二区| 欧美激情视频免费观看| 欧美人妻一区二区三区| 91综合久久爱com| 欧美性猛交xxxx黑人交| 天堂8在线天堂资源bt| 毛片免费在线| 成人免费电影视频| 91亚洲精品在线| 日韩免费av网站| 亚洲午夜电影| 久久亚洲国产精品| 天天干天天舔天天操| 黄色美女久久久| 在线电影院国产精品| 色综合av综合无码综合网站| 青草av在线| 国产精品国产三级国产| 欧美美乳视频网站在线观看| 亚洲毛片在线播放| 国产在线视频一区二区三区| 国产精品福利小视频| 国产精品500部| 国产精品地址| 久久视频免费观看| 在线观看天堂av| 国产一区二区三区探花 | 国产又粗又猛又爽又黄的网站 | 久久精品欧美视频| 亚洲ⅴ国产v天堂a无码二区| 亚洲欧美tv| 亚洲国产日韩欧美在线图片| 国产ts在线观看| 国产精品一区免费在线| 欧美日韩精品系列| 婷婷六月天在线| 日本另类视频| 91久久一区二区| 日韩精品一区二区三区色欲av| h片在线观看视频免费| 亚洲成人一二三| 欧美又粗又长又爽做受| 在线观看小视频| 亚洲欧美一区二区三区极速播放| 青青草影院在线观看| 免费网站成人| 国产精品久久午夜| 亚洲精品日韩精品| 日日夜夜精品一区| 国产精品国产馆在线真实露脸| 三区精品视频观看| 在线播放毛片| 亚洲人成精品久久久久| 日本成人在线不卡| 国产在线拍揄自揄拍视频 | 国产亚洲精品一区二区| 制服 丝袜 综合 日韩 欧美| 精品久久国产| 日韩一区二区精品视频| 欧美极品aaaaabbbbb| 激情av一区| 97视频在线观看网址| 成人午夜视频在线播放| 视频一区欧美日韩| 国产免费久久av| 国产毛片毛片毛片毛片毛片| 国产a级毛片一区| 好吊妞www.84com只有这里才有精品| 天天干,天天操,天天射| 久久精品网站免费观看| 一区二区三区|亚洲午夜| 18videosex性欧美麻豆| 午夜精品福利一区二区三区av| 久久久999视频| 久久久久伊人| 日韩欧美一区二区不卡| 亚洲最大成人网站| 99久久夜色精品国产亚洲1000部| 久久久久久伊人| 日韩电影在线观看一区二区| 韩国av一区二区三区四区| 国产激情一区二区三区在线观看| 欧美偷拍视频| 亚洲人妖av一区二区| 欧美又粗又长又爽做受| 国产精品久久久久久久久久齐齐| 日韩视频免费观看高清完整版| 在线精品一区二区三区| 999久久久精品国产| 国语自产精品视频在线看抢先版图片 | 欧美黄色片在线观看| 无码人妻精品一区二区三区蜜桃91 | 国产精品免费久久久久| 日本久久久网站| japanese23hdxxxx日韩| 精品美女一区二区三区| 国产视频不卡在线| 亚洲精品护士| 国产一区红桃视频| 日韩av高清在线| 亚洲精品视频在线看| 免费黄色特级片| 999久久久精品一区二区| 国产亚洲精品久久久久久牛牛| 免费在线一区二区三区| 奇米精品一区二区三区在线观看| 国产精品一区二区三区精品 | 国产女人18毛片水真多18精品| 一本色道久久综合狠狠躁篇怎么玩| 久久免费少妇高潮99精品| 奇米影视一区二区三区| 久久99影院| 青春草免费在线视频| 欧美精品在线观看播放| 亚洲自拍偷拍图| 亚洲美女色禁图| 91黄色精品| 麻豆av免费在线观看| 色www精品视频在线观看| 午夜剧场免费看| 欧美福利视频| 91视频免费在线| 在线视频自拍| 欧美色图在线观看| 成人黄色免费网址| 久久成人亚洲| 麻豆91蜜桃| 小视频免费在线观看| 精品国产乱码久久久久久牛牛| 日本在线一级片| 黑人巨大精品欧美一区| 亚洲在线播放电影| 国产精品天堂蜜av在线播放| 国产亚洲精品一区二区| 日韩电影在线观看一区二区| 久久久久久久免费视频了| 国产91在线免费| 久操成人av| 国产极品jizzhd欧美| 精品美女视频在线观看免费软件| 色婷婷综合久色| 久久成人激情视频| 日日摸夜夜添夜夜添国产精品| 欧美二区在线| 国产综合色在线观看| 揄拍成人国产精品视频| 中文字幕av网站| 日本一区二区久久| av免费一区二区| 一本一道久久综合狠狠老| 亚洲尤物视频网| 欧美草逼视频| 日韩国产在线播放| 无码人妻精品一区二区| 国产精品毛片大码女人| 中文字幕12页| 国语精品一区| 免费日韩电影在线观看| 日韩欧美一区二区三区免费观看 | 色婷婷综合五月| 日本欧美一区二区三区不卡视频| 蜜臀av性久久久久蜜臀aⅴ四虎 | 第一福利在线| 欧美日韩久久| 在线国产电影不卡| 人人艹在线视频| 国产激情一区二区三区四区 | 午夜在线免费观看视频| 欧美高清视频不卡网| 黄色一级视频免费观看| 91在线高清观看| 激情视频免费网站| 欧美.日韩.国产.一区.二区| 国产综合精品一区二区三区| 日韩av首页| 欧美日韩国产999| 神马精品久久| 欧美主播一区二区三区| 三级在线观看免费大全| av在线播放一区二区三区| 精品视频一区二区在线| 婷婷综合社区| 精品综合在线| 亚洲一区有码| 8x海外华人永久免费日韩内陆视频| 丁香婷婷在线| 亚洲国产成人精品久久| 中文字幕资源网| 亚洲午夜久久久久久久久电影院| 熟女高潮一区二区三区| 国产裸体歌舞团一区二区| 青青草原成人网| 91精品天堂福利在线观看| 久久精品国产综合精品| 亚洲青青一区| 青青久久aⅴ北条麻妃| 91在线中字| 亚洲午夜av久久乱码| 国产 欧美 精品| 欧美色成人综合| 日韩欧美三级视频| 一区二区三区日韩精品| 三区四区在线观看| 91一区二区在线观看| 国内av免费观看| 日韩精品免费专区| 日本中文字幕网址| 亚洲一区二区| 亚洲精品国产一区| 国产成人短视频在线观看| 丁香五月网久久综合| 日本免费一区二区三区等视频| 日本人成精品视频在线| av福利在线导航| 久久91超碰青草是什么| av在线免费观看网| 亚洲精品一区二区网址| 人妻视频一区二区三区| 欧美一区二区三区四区久久| 一区二区三区在线免费观看视频| 色哟哟欧美精品| www.国产com| 亚洲精品中文在线| 91麻豆免费视频网站| 国产精品美女久久久久久久久久久 | 久久久国产精华液| 亚洲欧洲日韩在线| 国产又粗又长又黄的视频| 国产偷国产偷亚洲高清人白洁| 欧美精品v国产精品v日韩精品| 欧美成人手机视频| 亚洲视频一区在线| 老熟妻内射精品一区| 中文字幕一区二区三区四区不卡| 国产真人真事毛片视频| 中文字幕免费不卡| 9.1片黄在线观看| 国产精品久久久久久久久免费丝袜| 久久久久久久毛片| 中文字幕久久午夜不卡| 久久久久无码精品国产sm果冻 | 影音先锋在线视频| 久久国产精品影片| 91在线中文| 久久久在线观看| jizzjizz中国精品麻豆| 午夜精品www| 偷拍自拍在线看| 日本久久久久久| 欧美日韩精品一区二区三区视频| 国产精品久久久久久久av电影| 国产情侣一区二区三区| 国产欧美一区二区三区视频| 亚洲色图综合| 国产传媒一区二区| 香蕉一区二区| 日韩欧美电影一区二区| 97精品在线| 波多野结衣与黑人| 日韩午夜高潮| 在线视频日韩一区| 国产中文字幕精品| chinese麻豆新拍video| 久久久久久久久久久99999| 性少妇xx生活| 亚洲线精品一区二区三区八戒| 国产成人愉拍精品久久| 欧美在线免费视屏| 国产精品爽爽久久久久久| 欧美大黄免费观看| 青梅竹马是消防员在线| 日韩在线视频网站| 成人在线高清免费| 国产精品吊钟奶在线| japansex久久高清精品| 国产精品乱码一区二区三区| 国产精品欧美日韩一区| 视频一区二区视频| 国产一区二区高清| xxx国产在线观看| 懂色av一区二区三区蜜臀| 一区二区三区四区免费| 亚洲色大成网站www久久九九| 日本中文字幕网| 欧美日韩一二三| 污污视频在线观看网站| 日韩小视频在线| 黄色在线观看www| 91精品免费久久久久久久久| 日本成人a网站| 色香蕉在线观看| 老鸭窝91久久精品色噜噜导演| 久久久九九九热| 国产亚洲制服色| 国产一级免费av| 欧美精品丝袜久久久中文字幕| 天堂资源最新在线| 欧美精品一二区| 国产电影一区二区三区爱妃记| 国内外成人免费视频| 97精品一区二区| 少妇激情一区二区三区| 91在线精品一区二区| 久久精品一区二区三| 欧美丰满美乳xxx高潮www| 免费人成黄页在线观看忧物| 久久久久久久一| 高清精品久久| 五月天亚洲综合情| 香蕉精品999视频一区二区| 亚洲熟女乱综合一区二区| 国产精品免费网站在线观看| 高潮毛片又色又爽免费| 亚洲黄色www网站| 91精品久久久久久粉嫩| 国产日韩在线精品av| 精品久久不卡| 东京热加勒比无码少妇| 不卡免费追剧大全电视剧网站| 唐朝av高清盛宴| 91精品国产综合久久久蜜臀粉嫩 | 日日夜夜亚洲精品| 日韩欧美亚洲在线| 免费国产自线拍一欧美视频| 艳妇乳肉亭妇荡乳av| 亚洲一区二区三区四区不卡| 国产黄色片网站| 久久久精品一区| 日日夜夜一区| 欧美性视频在线播放| 久久99久久99| 午夜国产小视频| 欧美久久久久免费| 免费黄色网页在线观看| 成人av番号网| 国产精品二区不卡| 久久精品视频在线观看免费| 中文字幕一区二区三区色视频 | 久久国产一区二区| 国产亚洲福利| 自拍偷拍中文字幕| 色噜噜狠狠成人中文综合| 国产在线一二| 国产精品免费小视频| 久久麻豆精品| 亚洲综合123| 亚洲国产美国国产综合一区二区| 丰满熟女一区二区三区| 国内成人精品一区| 亚洲丁香日韩| 亚洲成人av免费看| 国产精品国产三级国产aⅴ原创| 91久久国语露脸精品国产高跟| 久久五月情影视| 亚洲无线观看| 国产96在线 | 亚洲| 久久影院午夜片一区| 日批视频免费观看| 久久天天躁日日躁| 国产精品国产| 欧美成人免费高清视频| 中文字幕乱码久久午夜不卡| a级片在线播放| 91av视频在线观看| 日韩精品久久久久久久电影99爱| 亚洲av无日韩毛片久久| 亚洲va国产va欧美va观看| 欧美日韩在线中文字幕| 国产日韩欧美影视| 亚洲午夜久久久久久尤物| 在线免费观看日韩av| 欧美精品视频www在线观看| 色呦呦网站在线观看| 久久riav二区三区| 免费人成精品欧美精品 | 自拍日韩欧美| 成人无码www在线看免费| 欧美性猛片xxxx免费看久爱| 七七久久电影网| 新呦u视频一区二区| 成人激情视频网站| 天天综合久久综合| 欧美激情视频一区二区|