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

*(*int)(nil) = 0我注意到函数中有一行throw


//go:nosplit

func 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无法到达,为什么它在这里?有什么特别的用法吗?


素胚勾勒不出你
浏览 188回答 1
1回答

杨__羊羊

该行:*(*int)(nil) = 0尝试取消引用nil指针并为其分配值,这始终是运行时恐慌。代码永远不会到达这一行,但是如果它无论如何都会到达(例如,将来发生错误的代码更改),它会恐慌,因此可以检测到错误并且不会被忽视。在您的代码中做类似的事情也是常识,但使用更明显的“构造”,例如panic("unreachable"). 例如:func sign(a int) string {&nbsp; &nbsp; switch {&nbsp; &nbsp; case a > 0:&nbsp; &nbsp; &nbsp; &nbsp; return "Positive"&nbsp; &nbsp; case a < 0:&nbsp; &nbsp; &nbsp; &nbsp; return "Negative"&nbsp; &nbsp; case a == 0:&nbsp; &nbsp; &nbsp; &nbsp; return "Zero"&nbsp; &nbsp; default:&nbsp; &nbsp; &nbsp; &nbsp; panic("unreachable")&nbsp; &nbsp; }}请注意,在此示例中,这不仅是为了及早检测错误,也是一项要求,因为对于编译器来说,无法保证会到达 return 语句。您也可以将panic("unreachable")语句移到switch(而不是default分支)之后,这是一个口味问题。如果您将上述函数更改为不返回但打印符号,则让default分支恐慌仍然是一个好习惯,尽管这不是此变体中的要求:func printSign(a int) {&nbsp; &nbsp; switch {&nbsp; &nbsp; case a > 0:&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("Positive")&nbsp; &nbsp; case a < 0:&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("Negative")&nbsp; &nbsp; case a == 0:&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("Zero")&nbsp; &nbsp; default:&nbsp; &nbsp; &nbsp; &nbsp; panic("unreachable")&nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go