为什么Error()的优先级高于String()
我一直在看围棋的巡回赛,我不明白为什么会发生这种情况 当您有为什么Error()的优先级高于String(),string,go,String,Go,我一直在看围棋的巡回赛,我不明白为什么会发生这种情况 当您有Stringer(String()String)时,fmt将使用该方法打印到控制台。就像在 但是,如果添加Error()字符串,将调用此方法,而不是string()字符串 package main import "fmt" type Person struct { Name string Age int } func (p *Person) String() string { return fmt.Spr
Stringer
(String()String
)时,fmt
将使用该方法打印到控制台。就像在
但是,如果添加Error()字符串
,将调用此方法,而不是string()字符串
package main
import "fmt"
type Person struct {
Name string
Age int
}
func (p *Person) String() string {
return fmt.Sprintf("%v (%v years)", p.Name, p.Age)
}
func (p *Person) Error() string {
return fmt.Sprintf("Failed")
}
func main() {
a := &Person{"Arthur Dent", 42}
z := &Person{"Zaphod Beeblebrox", 9001}
fmt.Println(a, z)
}
结果:
失败
我不明白为什么
fmt.Println
使用Error
而不是String
仅仅因为这就是它的实现方式。错误
在实践中更为重要,因此如果实现了错误
接口,将打印该接口
package main
import "fmt"
type Person struct {
Name string
Age int
}
func (p *Person) String() string {
return fmt.Sprintf("%v (%v years)", p.Name, p.Age)
}
func (p *Person) Error() string {
return fmt.Sprintf("Failed")
}
func main() {
a := &Person{"Arthur Dent", 42}
z := &Person{"Zaphod Beeblebrox", 9001}
fmt.Println(a, z)
}
如有记录,请阅读以下文件包:
除非使用动词%T和%p打印,否则实现某些接口的操作数应考虑特殊的格式设置。按申请顺序:
因此,
error
在列表中排名第三,而String()
仅排名第四。原因很简单:当fmt使用它的任何打印函数时,它会对每个参数执行一个类型开关,以确定如何打印它,并且在该类型开关中,case error
出现在case Stringer
之前 忍者。。。到处都是忍者!