Nil 错误实例不显示为 Nil
在理解接口比较时,认识到它们评估类型和值是至关重要的。
考虑代码片段:
type Goof struct {}
func (goof *Goof) Error() string {
return fmt.Sprintf("I'm a goof")
}
func TestError(err error) {
if err == nil {
fmt.Println("Error is nil")
} else {
fmt.Println("Error is not nil")
}
}
func main() {
var g *Goof // nil
TestError(g) // expect "Error is nil"
}
这里,我们期望“Error is not nil”,因为 g 为零。然而,由于接口比较,我们得到“Error is nil”。这是因为 (*Goof)(nil) 的类型与 error(nil) 不同。
要解决此问题,您可以声明 var err error 而不是 var g *Goof。或者,如果您的函数返回错误,只需返回 nil。
为了进一步说明,接口比较检查类型是否相同,而不是类型是否实现接口。因此,以下示例演示了即使具有相同基础数据的非零接口也可能由于类型不同而比较不相等:
package main
import "fmt"
type Bob int
func main() {
var x int = 3
var y Bob = 3
var ix, iy interface{} = x, y
fmt.Println(ix == iy)
}
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3