Go 没有接收到错误会触发 panic 但接收到错误不会触发 panic
Go not receiving error will trigger panic but receiving error will not trigger panic
使用以下代码:
var i interface{} = "hello"
f, ok := i.(float64)
fmt.Println(f, ok)
f = i.(float64) // panic
fmt.Println(f)
为什么不捕获错误会引起恐慌而捕获错误不会引起恐慌?
是否有解释此概念的文档或博文?
这是一个类型断言,并记录在 Go 规范中 here:
The value of ok is true if the assertion holds. Otherwise it is false
and the value of v is the zero value for type T. No run-time panic
occurs in this case.
检查到位并且存在类型不匹配,该值将设置为 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
使用以下代码:
var i interface{} = "hello"
f, ok := i.(float64)
fmt.Println(f, ok)
f = i.(float64) // panic
fmt.Println(f)
为什么不捕获错误会引起恐慌而捕获错误不会引起恐慌? 是否有解释此概念的文档或博文?
这是一个类型断言,并记录在 Go 规范中 here:
The value of ok is true if the assertion holds. Otherwise it is false and the value of v is the zero value for type T. No run-time panic occurs in this case.
检查到位并且存在类型不匹配,该值将设置为 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