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