Разве метод не должен явно заключать контракт с сигнатурой интерфейса? - PullRequest
0 голосов
/ 08 марта 2019

Я новичок в golang, я не совсем понимаю, почему приведенная ниже демонстрационная программа может быть успешно выполнена,

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 возвращает только два, но он все еще работает. Как понять это поведение в Голанге?

Спасибо!

1 Ответ

2 голосов
/ 08 марта 2019

Foo не реализует fake. Это очевидно, если немного расширить пример кода ( попробовать его на игровой площадке Go ):

package main

import "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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...