请原谅我的速度慢,但我不明白何时调用Interface方法.我在Go Tour中看到这个例子:
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 main() { a := Person{"Arthur Dent",42} z := Person{"Zaphod Beeblebrox",9001} fmt.Println(a,z) }
我知道func(p Person)接收String()方法并返回我想要显示的字符串.
但是在某个地方,main()中的fmt.Println必须以某种方式调用String(),对吧?
我看了一下godoc fmt的来源,但我还是想不出来!
例如,如果我添加自己的接口,让我们说Stringer2使用方法String2()并创建一个func(p Person)String2(){….},那么String()如何被fmt.Println执行,但不是String2()?
我知道,我很困惑自己!
该值作为接口{}传递给Println,并检查它是否通过
“type assertion”通常以
“type switch”的形式满足fmt.Stringer接口.
func IsStringer(i interface{}) { switch s := i.(type) { case fmt.Stringer: fmt.Println("Person a has a String() method") fmt.Println(s.String()) default: fmt.Println("not a stringer") } // OR for a single type if s,ok := i.(fmt.Stringer); ok { fmt.Println("Person a has a String() method") fmt.Println(s.String()) } }
但是,从fmt软件包打印时,其他方法可能优先.首先检查fmt.Formatter,fmt.GoStringer,错误,然后最后检查fmt.Stringer.