Golang中是否支持隐式调用接口函数?

huangapple go评论81阅读模式
英文:

Golang, Go : implicitly calling interface function?

问题

我已经翻译好了,以下是翻译的内容:

我有这个函数

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(), "它没有工作",
    }
}

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

请注意,这是您提供的代码和问题的翻译。如果您有任何其他问题,请告诉我。

英文:

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

I have this function

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

But

as you see below, I never called it but how come it is called in the final output?

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

答案1

得分: 1

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

详细信息请参见源代码。代码中的部分如下所示:

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

在类型切换语句中检查传递对象的类型,如果该对象实现了error接口,则使用v.Error()作为值。

英文:

fmt.Println and the other functions in pkg/fmt analyze the objects passed to it.
If it is an error, the function calls .Error() on the passed object and prints the string
returned by Error().

See the source for details. The code says:

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

The type of the passed object is checked in a type switch statement and in case of the object
implementing the error interface, v.Error() is used as value.

huangapple
  • 本文由 发表于 2013年10月18日 03:29:15
  • 转载请务必保留本文链接:https://go.coder-hub.com/19435537.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定