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

前端之家收集整理的这篇文章主要介绍了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相关文章