Golang:在哪里调用接口方法?

请原谅我的速度慢,但我不明白何时调用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.

相关文章

什么是Go的接口? 接口可以说是一种类型,可以粗略的理解为他...
1、Golang指针 在介绍Golang指针隐式间接引用前,先简单说下...
1、概述 1.1 Protocol buffers定义 Protocol buffe...
判断文件是否存在,需要用到"os"包中的两个函数: os.Stat(...
1、编译环境 OS :Loongnix-Server Linux release 8.3 CPU指...
1、概述 Golang是一种强类型语言,虽然在代码中经常看到i:=1...