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

时间:2015-12-11 17:57:51

标签: go

我不明白在什么时候调用了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()方法并返回我要显示的string。但是fmt.Println方法中的main()必须在某个时候调用String(),对吗?

我在 godoc 中查看了fmt的来源,但我仍然无法理解它!

另一个例子:

如果我添加自己的界面,请使用名为Stringer2的方法说String2(),然后创建func (p Person) String2() {....}String()如何执行fmt.Println,但String2()不执行?

2 个答案:

答案 0 :(得分:12)

该值作为function loadJSON(){ console.log("loading JSON") var jsonFile = themeURL+"/map.json" $.getJSON(jsonFile, function(data){ console.log("loaded JSON") $("#infobox").fadeOut(1000) info = data $("#info rect").on("click", pointClick); }) } 传递给Println,并且通过"type assertion"通常以{{3}的形式检查它是否满足interface{}接口}}

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()) } } 包打印时,其他方法可能优先。首先检查fmtfmt.Formatterfmt.GoStringer,然后是error

答案 1 :(得分:1)

fmt包适用于它定义的接口,在本例中为Stringer。它不知道你定义的接口,所以即使你传递了一个符合String2()接口的类型,它也不会知道调用Stringer2

接口是一种在类型之间具有共同行为的方法。因此,如果您创建一个函数Foo(s Stringer2),Foo可以简单地调用s.String2(),确保传入其中的任何内容都具有函数String2()

为了更深入,fmt.Println采用interface{}类型,然后使用反射来检查给定的参数是否符合Stringer接口,然后调用String()

有意义吗?