<h4>刚开始学go语言,在最近学习go指南里遇到一个问题,貌似一个结构体,或者说被type语法定义的新类型,目前是结构体和基本类型的新名字,在实现error和Stringers接口之后,使用Println方法时调用会有优先级,想问问大佬们为什么会这样。
<p>下面是代码</p>
<pre><code>
package main
import (
"fmt"
)
type MyError struct {
What string
}
func (e MyError) Error() string {
return "Error()"
}
func (e MyError) String() string{
return "String()"
}
func main() {
myerr:=MyError{"nothing"}
fmt.Println(myerr)
}
</code></pre>
此时跑出来的结果是
![屏幕快照 2017-12-18 下午10.19.41.png](https://static.studygolang.com/171218/4d229ef8cbe907bae24996758b52a1db.png)
如果我把上述代码中的Error()注释掉,结果则如下
![屏幕快照 2017-12-18 下午10.20.11.png](https://static.studygolang.com/171218/f62757d164337baf1d9ac73253de0cc2.png)
是不是一个结构体实现了error接口就默认它是一个error了,所以优先调用了,请指教
fmt调用的源码是这样的
```
switch verb {
case 'v', 's', 'x', 'X', 'q':
// Is it an error or Stringer?
// The duplication in the bodies is necessary:
// setting handled and deferring catchPanic
// must happen before calling the method.
switch v := p.arg.(type) {
case error:
handled = true
defer p.catchPanic(p.arg, verb)
p.fmtString(v.Error(), verb)
return
case Stringer:
handled = true
defer p.catchPanic(p.arg, verb)
p.fmtString(v.String(), verb)
return
}
}
```
#1
更多评论