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

Go 不接收错误会触发恐慌,但接收错误不会触发恐慌

Go 不接收错误会触发恐慌,但接收错误不会触发恐慌

Go
神不在的星期二 2022-06-13 17:17:44
使用以下代码:var i interface{} = "hello"f, ok := i.(float64)fmt.Println(f, ok)f = i.(float64) // panicfmt.Println(f)为什么不捕获错误会导致恐慌,而捕获错误不会导致恐慌?任何解释此概念的文档或博客文章?
查看完整描述

1 回答

?
杨__羊羊

TA贡献1943条经验 获得超7个赞

这是一个类型断言,并记录在 Go 规范中:


如果断言成立,则 ok 的值为真。否则它是假的并且 v 的值是类型 T 的零值。在这种情况下不会发生运行时恐慌。


检查到位并且存在类型不匹配,该值将设置为 float32(数字)类型的“零”值,因此为 0。


如果没有运行时检查,您应该绝对确定类型将匹配,并且规范规定如果不匹配就会发生恐慌。


这种模式与基本错误检查没有什么不同,例如


// v, err := someapi(). // Should check err ...


v, _ := someapi() // deliberately ignore error


v.SomeMethod() // ... Panic as v probably nil if there was an error


查看完整回答
反对 回复 2022-06-13
  • 1 回答
  • 0 关注
  • 125 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号