我不明白在什么时候调用了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()
不执行?
答案 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())
}
}
包打印时,其他方法可能优先。首先检查fmt
,fmt.Formatter
,fmt.GoStringer
,然后是error
。
答案 1 :(得分:1)
fmt
包适用于它定义的接口,在本例中为Stringer
。它不知道你定义的接口,所以即使你传递了一个符合String2()
接口的类型,它也不会知道调用Stringer2
。
接口是一种在类型之间具有共同行为的方法。因此,如果您创建一个函数Foo(s Stringer2)
,Foo可以简单地调用s.String2()
,确保传入其中的任何内容都具有函数String2()
。
为了更深入,fmt.Println
采用interface{}
类型,然后使用反射来检查给定的参数是否符合Stringer
接口,然后调用String()
。
有意义吗?