gpt4 book ai didi

go - 这个满足错误接口(interface)的结构的 nil 实例没有显示为 nil

转载 作者:IT王子 更新时间:2023-10-29 01:49:44 25 4
gpt4 key购买 nike

这应该是给某人的礼物。为什么我在这里没有得到我期望的结果(“错误不为零”)?

http://play.golang.org/p/s8CWQxobVL

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"
}

最佳答案

事实证明,这是 a Frequently Asked Question about Go ,简短的回答是接口(interface)比较比较类型和值,(*Goof)(nil)error(nil) 有不同的类型。

因为 if err != nil 是标准的,所以您需要一个可以使用它的返回值。您可以声明 var err error 而不是 var g *Goof:err 的零值很方便 error(nil)

或者,如果您的函数返回一个错误return nil 将返回您想要的。

有关更多背景信息,这是常见问题解答的开头:

Under the covers, interfaces are implemented as two elements, a type and a value. The value, called the interface's dynamic value, is an arbitrary concrete value and the type is that of the value. For the int value 3, an interface value contains, schematically, (int, 3).

An interface value is nil only if the inner value and type are both unset, (nil, nil). In particular, a nil interface will always hold a nil type. If we store a pointer of type *int inside an interface value, the inner type will be *int regardless of the value of the pointer: (*int, nil). Such an interface value will therefore be non-nil even when the pointer inside is nil.

并且 == 严格检查类型是否相同,而不是类型(*Goof)是否实现接口(interface)(错误)。查看the original更多。

如果有助于澄清,这不仅发生在 nil 中:在 this example 中,xy变量的数据显然是3,但它们有不同的类型。当您将 xy 放入 interface{} 时,它们比较为不相等:

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)
}

关于go - 这个满足错误接口(interface)的结构的 nil 实例没有显示为 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28621496/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com