亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

*(*int)(nil) = 0 在 golang 中是什么意思?

*(*int)(nil) = 0 在 golang 中是什么意思?

Go
素胚勾勒不出你 2022-07-11 16:41:44
*(*int)(nil) = 0我注意到函數中有一行throw//go:nosplitfunc throw(s string) {    // Everything throw does should be recursively nosplit so it    // can be called even when it's unsafe to grow the stack.    systemstack(func() {        print("fatal error: ", s, "\n")    })    gp := getg()    if gp.m.throwing == 0 {        gp.m.throwing = 1    }    fatalthrow()    *(*int)(nil) = 0 // not reached}是什么*(*int)(nil) = 0意思?既然這條線*(*int)(nil) = 0無法到達,為什么它在這里?有什么特別的用法嗎?
查看完整描述

1 回答

?
楊__羊羊

TA貢獻1943條經驗 獲得超7個贊

該行:


*(*int)(nil) = 0

嘗試取消引用nil指針并為其分配值,這始終是運行時恐慌。代碼永遠不會到達這一行,但是如果它無論如何都會到達(例如,將來發生錯誤的代碼更改),它會恐慌,因此可以檢測到錯誤并且不會被忽視。


在您的代碼中做類似的事情也是常識,但使用更明顯的“構造”,例如panic("unreachable"). 例如:


func sign(a int) string {

    switch {

    case a > 0:

        return "Positive"

    case a < 0:

        return "Negative"

    case a == 0:

        return "Zero"

    default:

        panic("unreachable")

    }

}

請注意,在此示例中,這不僅是為了及早檢測錯誤,也是一項要求,因為對于編譯器來說,無法保證會到達 return 語句。您也可以將panic("unreachable")語句移到switch(而不是default分支)之后,這是一個口味問題。


如果您將上述函數更改為不返回但打印符號,則讓default分支恐慌仍然是一個好習慣,盡管這不是此變體中的要求:


func printSign(a int) {

    switch {

    case a > 0:

        fmt.Println("Positive")

    case a < 0:

        fmt.Println("Negative")

    case a == 0:

        fmt.Println("Zero")

    default:

        panic("unreachable")

    }

}


查看完整回答
反對 回復 2022-07-11
  • 1 回答
  • 0 關注
  • 226 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號