我开始学习Go,但对以下内容有所了解:
package main import "fmt" type I interface { foo(interface {}) } type S struct {} func (s S) foo(i int) { fmt.Println(i) } func main() { var i I = S{} i.foo(2) }
失败的原因是:
cannot use S literal (type S) as type I in assignment: S does not implement I (wrong type for foo method) have foo(int) want foo(interface {})
foo(int)考虑到int实现的事实,我不明白为什么Go不接受签名interface {}。有人可以帮忙解释吗?
foo(int)
int
interface {}
我认为您对界面的理解不够充分。Interface {}本身就是一种类型。它由两部分组成:基础类型和基础值。
Golang没有重载。Golang类型系统按名称匹配,并且要求类型一致
因此,当您定义将接口类型作为参数的函数时:
foo(interface {})
这与采用int类型的函数不同:
因此,您应该将以下行更改为
func (s S) foo(i interface{}) { fmt.Println(i) }
或对此更好:
type I interface { foo() } type S struct { I int } func (s S) foo() { fmt.Println(s.I) } func main() { var i I = S{2} i.foo() }