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



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

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

行:

*(*int)(nil) = 0

尝试取消引用nil指针并为其赋值,这总是运行时死机。代码永远不应该到达这一行,但如果它无论如何都会到达(例如,未来有错误的代码更改(,它会惊慌失措,这样错误就可以被检测到,不会被忽视。

在代码中做一些类似的事情也是常识,但有一个更明显的";构造";例如CCD_ 6。例如:

func sign(a int) string {
switch {
case a > 0:
return "Positive"
case a < 0:
return "Negative"
case a == 0:
return "Zero"
default:
panic("unreachable")
}
}

请注意,在本例中,这不仅是为了尽早检测错误,也是一项要求,因为对于编译器来说,无法保证会到达返回语句。您也可以将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")
}
}

最新更新