gpt4 book ai didi

戈朗,围棋 : implicitly calling interface function?

转载 作者:IT王子 更新时间:2023-10-29 02:17:55 27 4
gpt4 key购买 nike

http://play.golang.org/p/xjs-jwMsr7

我有这个功能

 func (e *MyError) Error() string {
return fmt.Sprintf("AT %v, %s", e.When, e.What)
}

但是

如下所示,我从未调用过它,但为什么会在最终输出中调用它?

type MyError struct {
When time.Time
What string
}

func (e *MyError) Error() string {
return fmt.Sprintf("AT %v, %s", e.When, e.What)
}

func run() error {
return &MyError{
time.Now(), "it didn't work",
}
}

func main() {
if err := run(); err != nil {
fmt.Println(err)
}
}

最佳答案

fmt.Printlnpkg/fmt 中的其他函数分析传递给它的对象。如果是一个错误,该函数在传递的对象上调用 .Error() 并打印字符串由 Error() 返回。

参见 the source了解详情。代码说:

switch v := p.field.(type) {
case error:
// ...
p.printField(v.Error(), verb, plus, false, depth)
return
// ...
}

在类型切换语句中检查传递的对象的类型,如果是对象实现error interface , v.Error() 被用作值。

关于戈朗,围棋 : implicitly calling interface function?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19435537/

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