Golang fmt.Println()
函数应该接收...interface{}
类型的参数。使用接口,我们只能通过其值与下位值进行交互,这意味着即使有值,也无法直接访问值的字段。但是空接口不会实现任何方法,因此,如果我们尝试定义如下函数:
func test(i interface{}) {
i.M()
}
我们会收到错误消息-i.M undefined (type interface {} is interface with no methods)
我以为golang依赖于一些默认类型的方法,但是正如我所看到的,没有像方法继承这样的东西:
type F1 float64
func (f F1) M() {
fmt.Println(f)
}
type F2 F1
func main() {
var i interface{}
var j F1 = 42.42
j.M() // OK
var k F2 = 42.42
k.M() // NO WAY!
i = j
i.M() // Also fails -- i.M undefined
}
因此,fmt.Println
的工作原理是:
1.我们只能通过方法与接口下的值进行交互
2.我们无法从空接口调用任何方法,但是fmt.Println会接收到空方法。