该方法不应该明确地与接口的签名签约吗?

我刚接触golang,不太明白为什么下面的demo程序可以执行成功,


type fake interface {

    getAge(valueInt int,  valStr string) (age int, name string, err error)

}


type Foo struct {

    name string

}


func (b *Foo) getAge(valueInt int, valStr string) (age int, retErr error) {

    age = valueInt

    return age, nil

}

func main() {

    inst := &Foo{name:"foo"}

    value, _ := inst.getAge(2, "foo")

    fmt.Println(value)

}

接口要返回三个值,但方法getAge只返回两个,但它仍然有效。如何理解 golang 中的这种行为?


谢谢!


慕莱坞森
浏览 98回答 1
1回答

波斯汪

Foo不执行fake。如果您稍微扩展您的代码示例(在 Go 操场上尝试),这是显而易见的:package mainimport "fmt"type fake interface {    getAge(valueInt int, valStr string) (age int, name string, err error)}type Foo struct {    name string}func (b *Foo) getAge(valueInt int, valStr string) (age int, retErr error) {    age = valueInt    return age, nil}func bar(f fake) {  _, name, _ := f.getAge(10, "")}func main() {    inst := &Foo{name: "foo"}    value, _ := inst.getAge(2, "foo")    fmt.Println(value)    bar(inst)}这会产生一个非常具有描述性的编译错误:prog.go:28:5: cannot use inst (type *Foo) as type fake in argument to bar:    *Foo does not implement fake (wrong type for getAge method)        have getAge(int, string) (int, error)        want getAge(int, string) (int, string, error)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go