为了账号安全,请及时绑定邮箱和手机立即绑定

*(*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 关注
  • 187 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信