使用以下代码: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
- 1 回答
- 0 关注
- 125 浏览
添加回答
举报
0/150
提交
取消
