golang中当打印一个变量时,如果该变量实现了String()方法,则会默认调用该方法来获得字符串表示,
import "fmt"
type Object struct {
Name string
}
func (u *Object) String() string {
fmt.Println("call String func")
return u.Name
}
func main() {
u := &Object{Name: "南山彭于晏"}
fmt.Println(u)
}
输出结果:
call String func
南山彭于晏
同时,当我们打印一个error对象时,则会默认调用该error对象的Error()方法,来输出错误信息:
package main
import "fmt"
type Object struct {
Name string
}
//func (u *Object) String() string {
// fmt.Println("call String func")
// return u.Name
//}
func (u *Object) Error() string {
fmt.Println("call Error func")
return fmt.Sprintf("%s trigger an error", u.Name)
}
func main() {
u := &Object{Name: "南山彭于晏"}
fmt.Println(u)
}
输出结果:
call Error func
南山彭于晏 trigger an error
那么问题来了,如果一个对象同时实现了Stringer和error接口,这时要打印这个对象,会默认调用哪个方法呢,测试的结果是Error()方法的优先级高于String()方法