小编典典

为什么方法签名必须与接口方法完全匹配

go

我开始学习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 {}。有人可以帮忙解释吗?


阅读 224

收藏
2020-07-02

共1个答案

小编典典

我认为您对界面的理解不够充分。Interface {}本身就是一种类型。它由两部分组成:基础类型和基础值。

Golang没有重载。Golang类型系统按名称匹配,并且要求类型一致

因此,当您定义将接口类型作为参数的函数时:

foo(interface {})

这与采用int类型的函数不同:

foo(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()
}
2020-07-02