gpt4 book ai didi

GoLang 错误/接口(interface)机制

转载 作者:IT王子 更新时间:2023-10-29 02:16:08 24 4
gpt4 key购买 nike

首先,我不太确定这个问题是与错误相关,还是与 GoLang 中的接口(interface)相关

我正在按照教程学习 GoLang。本教程中出现了问题 page

这是错误接口(interface)的基本演示。当我像这样更改代码时,我感到困惑:

package main

import (
"fmt"
"time"
)

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() *MyError {
return &MyError{
time.Now(), "it didn't work",
}
}

func main() {
if err := run(); err != nil {
fmt.Println(err)
}
err1 := MyError{time.Now(), "it works again"}
fmt.Println(err1)
fmt.Println(err1.Error())
}

这段代码的输出是:

at 2015-04-06 15:00:07.1541719 +0800 CST, it didn't work
{2015-04-06 15:00:07.155172 +0800 CST it works again}
at 2015-04-06 15:00:07.155172 +0800 CST, it works again

让我困惑的是 fmt 在什么情况下会隐式调用 MyError.Error() 接口(interface)。

据我了解,第一个和第二个 fmt.Println() 应该具有相同的变量类型:MyError。但很明显,第一次调用涉及 MyError 类型的 Error() 的隐式调用,而第二次调用则没有。

什么机制造成了这种差异?

感谢您研究这个初学者的问题!

最佳答案

您的代码将 Error() 实现绑定(bind)到指针 *MyError。

在您的代码中,您传递的是类型(准确地说是其副本)而不是指针。

如果你改变

err1 := MyError{time.Now(), "it works again"}

err1 := &MyError{time.Now(), "it works again"}

它将如您所愿地工作。

关于GoLang 错误/接口(interface)机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29466918/

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