Go 中的接口和类型比较
在 Go 中,接口提供了一种方法来定义不同类型可以实现的一组通用方法。但是,了解接口比较如何工作以避免意外行为非常重要。
考虑以下代码:
<code class="go">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" }</code>
在此示例中,我们创建一个实现错误接口的自定义类型 Goof 。然后,我们将 *Goof 类型的 nil 指针传递给需要错误的函数 TestError。与直觉相反,程序不会打印“Error is not nil.”
这是因为接口比较不仅检查值,还检查类型。在这种情况下, *Goof 的 nil 实例与错误接口的类型不同。因此,比较 err == nil 失败。
要解决此问题,有多种选择。一种是直接将 err 声明为 error 类型的变量:
<code class="go">var err error = g</code>
另一种选择是如果发生错误,则从函数中返回 nil:
<code class="go">func MyFunction() error { // ... if errorOccurred { return nil } // ... }</code>
通过了解接口比较的方式工作,您可以避免潜在的陷阱并编写更有效的 Go 代码。
以上是为什么 Go 中将 nil 接口与 nil 进行比较会失败?的详细内容。更多信息请关注PHP中文网其他相关文章!