Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Error()的优先级高于String()_String_Go - Fatal编程技术网

为什么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打印,否则实现某些接口的操作数应考虑特殊的格式设置。按申请顺序:

  • 如果操作数实现格式化程序接口,将调用它。格式化程序提供对格式化的精细控制

  • 如果%v谓词与#标志(%#v)一起使用,并且操作数实现了GoStringer接口,则将调用该接口

  • 如果格式(对于Println等隐式为%v)对字符串(%s%q%v%x%x)有效,则以下两条规则适用:

  • 如果操作数实现了error接口,则会调用error方法将对象转换为字符串,然后根据谓词(如果有)的要求对字符串进行格式化

  • 如果操作数实现了方法String()String,则将调用该方法将对象转换为字符串,然后根据谓词(如果有)的要求对字符串进行格式化


  • 因此,
    error
    在列表中排名第三,而
    String()
    仅排名第四。

    原因很简单:当fmt使用它的任何打印函数时,它会对每个参数执行一个类型开关,以确定如何打印它,并且在该类型开关中,
    case error
    出现在
    case Stringer
    之前

    忍者。。。到处都是忍者!