go里的内建接口

type Person struct {
    Name string
    Age  int
}

func (p Person) String() string {
    return fmt.Sprintf("%v (%v years)", p.Name, p.Age)
}

func main() {
    a := Person{"Arthur Dent", 42}
    z := Person{"Zaphod Beeblebrox", 9001}
    fmt.Println(a, z)
}

看Go指南上说了因为string是内建接口。所以在打印a的时候会调用实现接口的String()方法?

共 4 个回复


stevewang

Stringer接口定义在fmt包中,不是内建接口。go的内建接口只有error

# 0

HOOHyou

@stevewang
谢谢你的回答。是我看的不仔细。go指南只是说error接口和Stringer比较类似。

而且看教程上的代码确实很类似,都是把实现的方法定义给一个结构体。然后打印这个结构体,就会自动调用实现的方法了。

就这个“自动调用实现的方法”不太理解。我都没看到有a.String()之类的代码。这个是go独特的写法吗?

# 1

stevewang

fmt.Println的签名是func Println(a ...interface{}) (n int, err error),因此az是作为interface{}类型的参数传入。
fmt.Println函数内部会对参数进行接口查询,如果参数对象实现了Stringer接口,就会调用Stringer接口的String()方法获得字符串。

# 2