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

Golang新提案:panic?能不能加個?PanicError?

 更新時間:2023年12月26日 11:27:12   作者:煎魚  
這篇文章主要為大家介紹了Golang的新提案關(guān)于panic能不能加個PanicError的問題分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

在我們學(xué)習(xí)和平時使用 Go 時,一定會涉及到一個內(nèi)置函數(shù) panic:

func panic(v any)

調(diào)用該函數(shù)后會停止代碼的控制流程并開始恐慌,達(dá)到扭轉(zhuǎn)當(dāng)前程序控制流的目的。在使用上也常常和 defer 和 recover 關(guān)聯(lián)上。

快速 Demo

以下是一個簡單的使用 Demo:

func main() {
 panic("腦子進(jìn)煎魚了")
 _, err := os.Create("/tmp/file")
 if err != nil {
  log.Fatalln(err)
 }
}

輸出結(jié)果:

$ go run demo.go 
panic: 腦子進(jìn)煎魚了
goroutine 1 [running]:
main.main()
 /Users/eddycjy/demo.go:10 +0x25
exit status 2

看著都沒什么問題。輸出結(jié)果符合預(yù)期。

一點(diǎn)爭議

由于 Go 起協(xié)程(goroutine)非常簡單、方便,因此絕大部分開發(fā)者在應(yīng)用程序中會經(jīng)常用 goroutine 去做各種并發(fā)處理的邏輯,一看不小心。就很有可能會引發(fā)程序中的 panic,導(dǎo)致整個應(yīng)該程序崩潰,出現(xiàn)事故。(見過好幾起低級錯誤了,覺得程序沒問題,所以也沒有主動加防御性代碼)

有一個比較常見觸發(fā)的場景之一:空指針調(diào)用。時不時就能見到幾個應(yīng)用又誘發(fā)了。

如下代碼:

type T struct {
 Name string
}
func main() {
 var user *T
 go func() {
  // 異步執(zhí)行一些業(yè)務(wù)流程,不小心 panic 了...
  fmt.Println(user.Name)
 }()
 // 做一些事情...
 time.Sleep(time.Second * 1)
 fmt.Println("腦子進(jìn)煎魚了")
}

輸出結(jié)果:

$ go run demo.go
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x8 pc=0x1087178]

goroutine 6 [running]:
main.main.func1()
 /Users/eddycjy/demo.go:16 +0x18
created by main.main in goroutine 1
 /Users/eddycjy/demo.go:14 +0x31
exit status 2

當(dāng)然,這也是有辦法解決的。標(biāo)準(zhǔn)的方式是通過 recover,捕獲 panic。如下代碼:

go func() {
  defer func() {
   if r := recover(); r != nil {
    fmt.Println("Recovered in f", r)
   }
  }()
  // 異步執(zhí)行一些業(yè)務(wù)流程,不小心 panic 了...
  fmt.Println(user.Name)
 }()

輸出結(jié)果:

Recovered in f runtime error: invalid memory address or nil pointer dereference
腦子進(jìn)煎魚了

又或是基于 goroutine+recvoer 封裝一個協(xié)程調(diào)用的方法。要求使用這類工具庫來規(guī)避這個 “坑”。

但不得不說,很多同學(xué)崩就崩在不覺得這個地方會出問題,但就是有問題。最后只能一溜煙全都用封裝好的工具庫來起 goroutine 了。

新提案:可定義 panic 錯誤信息

在前面的案例中,我們可以看到 panic 后現(xiàn)在的輸出信息如下:

panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x8 pc=0x1087178]

goroutine 6 [running]:
main.main.func1()
 /Users/eddycjy/demo.go:16 +0x18
created by main.main in goroutine 1
 /Users/eddycjy/demo.go:14 +0x31
exit status 2

程序輸出了恐慌值和 goroutine 堆棧跟蹤。

這第一眼看起來是非常迷惑的,要看錯誤信息。如果是程序內(nèi)拋的空指針,還要去翻堆棧信息去猜,再看是哪里的程序。做一輪排查、定位、驗證。

因此社區(qū)里 @Mitar 提出了《proposal: runtime: provide a way to format output in unhandled panics[1]》的提案。希望可以針對意外情況+無人處理的 panic 錯誤進(jìn)行自定義的格式化處理。

提案中希望 panic 新增 PanicError:

type panicError interface {
    error
    PanicError() string
}

如果值實現(xiàn)了該接口,在 panic 時則會優(yōu)先調(diào)用 PanicError 方法,為錯誤處理提供一個可選選項,可以為調(diào)試補(bǔ)充額外的有用信息。

這樣就可以進(jìn)一步區(qū)分出 Panic 錯誤和普通 Error 錯誤的方法,并且針對 Panic 的錯誤做各種奇怪的操作和補(bǔ)充。

總結(jié)

今天給大家分享了社區(qū)對于 panic 優(yōu)化的一個小點(diǎn)。原提案作者的目的是為了針對 panic 錯誤新增 PanicError 方法,若存在則優(yōu)先使用該方法,而非與普通 error 共用 Error 方法,并以此去做好區(qū)分識別和實現(xiàn)。

在 Go 中對 panic 的優(yōu)化,官方一直都是比較遲緩的。一方面是大佬們比較少寫業(yè)務(wù)代碼,另外一方面是類似對 panic 加全局?jǐn)r截器避免崩潰等方式,也比較違背開創(chuàng)語言時的哲學(xué)宗旨。

參考資料

proposal: runtime: provide a way to format output in unhandled panics: https://github.com/golang/go/issues/63455 

以上就是Golang新提案panic 能不能加個 PanicError的問題分析內(nèi)容,更多關(guān)于Go panic PanicError的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • golang基于websocket通信tcp keepalive研究記錄

    golang基于websocket通信tcp keepalive研究記錄

    這篇文章主要為大家介紹了golang基于websocket通信tcp keepalive研究記錄,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • 詳解如何在Go中使用Zap管理日志

    詳解如何在Go中使用Zap管理日志

    Zap提供了兩種類型的日志記錄器—Sugared?Logger和Logger,可以更好的管理日志,這篇文章主要為大家介紹了使用Zap管理日志的具體方法,需要的可以了解一下
    2023-07-07
  • Golang http請求封裝的代碼示例

    Golang http請求封裝的代碼示例

    http請求封裝在項目中非常普遍,下面筆者封裝了http post請求傳json、form 和get請求,以備將來使用,文中代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • golang json性能分析詳解

    golang json性能分析詳解

    json格式可以算我們?nèi)粘W畛S玫男蛄谢袷街涣?,Go語言作為一個由Google開發(fā),號稱互聯(lián)網(wǎng)的C語言的語言,自然也對JSON格式支持很好。下面這篇文章主要給大家詳細(xì)分析介紹了golang json性能的相關(guān)資料,需要的朋友可以參考下。
    2018-02-02
  • Golang使用泛型對數(shù)組進(jìn)行去重的實現(xiàn)

    Golang使用泛型對數(shù)組進(jìn)行去重的實現(xiàn)

    本文主要介紹了Golang使用泛型對數(shù)組進(jìn)行去重的實現(xiàn),通過使用類型參數(shù)T和類型約束any,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-02-02
  • 一文詳解Go語言中方法的指針接收者與值接收者

    一文詳解Go語言中方法的指針接收者與值接收者

    在 Go 語言里,方法是一種特殊的函數(shù),它與特定的類型關(guān)聯(lián),方法可以使用值接收者或者指針接收者,理解這兩種接收者的區(qū)別和使用場景,對于編寫高效、正確的 Go 代碼至關(guān)重要,本文將深入剖析指針接收者和值接收者的特點(diǎn),需要的朋友可以參考下
    2025-06-06
  • go 如何修改postgresql的配置參數(shù)

    go 如何修改postgresql的配置參數(shù)

    這篇文章主要介紹了go 如何修改postgresql的配置參數(shù),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-01-01
  • Golang?統(tǒng)計字符串中數(shù)字字母數(shù)量的實現(xiàn)方法

    Golang?統(tǒng)計字符串中數(shù)字字母數(shù)量的實現(xiàn)方法

    這篇文章主要介紹了Golang?統(tǒng)計字符串中數(shù)字字母數(shù)量,本文給出了兩種從字符串獲取數(shù)字與字母數(shù)量的方法,分別是ASCII 碼值和正則表達(dá)式,需要的朋友可以參考下
    2022-06-06
  • 詳解Golang time包中的time.Duration類型

    詳解Golang time包中的time.Duration類型

    在日常開發(fā)過程中,會頻繁遇到對時間進(jìn)行操作的場景,使用 Golang 中的 time 包可以很方便地實現(xiàn)對時間的相關(guān)操作,本文講解一下 time 包中的 time.Duration 類型,需要的朋友可以參考下
    2023-07-07
  • Go語言sort包函數(shù)使用示例

    Go語言sort包函數(shù)使用示例

    這篇文章主要為大家介紹了Go語言sort包函數(shù)使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06

最新評論

汉沽区| 金华市| 潢川县| 崇阳县| 涟源市| 封丘县| 呼伦贝尔市| 石家庄市| 罗城| 吉隆县| 龙泉市| 靖边县| 石楼县| 泗洪县| 湘潭县| 乌兰察布市| 扎兰屯市| 得荣县| 逊克县| 镇康县| 台湾省| 来安县| 深圳市| 云浮市| 福泉市| 安国市| 富川| 杂多县| 阜宁县| 翁牛特旗| 溧水县| 周宁县| 玉林市| 诸城市| 邻水| 鄂州市| 临澧县| 合山市| 隆安县| 屏南县| 澜沧|