использовать цепочечные методы на унаследованной структуре - PullRequest
0 голосов
/ 06 ноября 2018

Я новичок в Go. Я решаю проблему, похожую на эту, у меня есть структура Dog, унаследованная от структуры Animal. Я хочу связать метод так, чтобы я мог получить такой результат, как "Я - животное. Гав!" но когда я запускаю программу, она генерирует ошибку

dog.Animal.Hello (). Кора не определена (тип * У животного нет поля или метода Кора)

type Animal struct {
    name string
    age int
}

func (animal *Animal) Hello() *Animal {
    fmt.Println("I am an animal")
    return animal
}

type Dog struct {
    *Animal
}

func (dog *Dog) Bark() *Dog {
    fmt.Println("woof!")
    return dog
}

func main() {
    dog := &Dog{&Animal{name: "Peter", age: 25}}
    dog.Hello().Bark()
}

Как я могу пройти через это. Спасибо за любую рекомендацию

1 Ответ

0 голосов
/ 06 ноября 2018

dog.Hello() возвращает *Animal, а не *Dog, поэтому вы не можете просто вызвать .Bark() для возвращенного значения.

Обратите внимание, что вызов dog.Hello() на самом деле не вызывает Hello() в структуре Dog, а скорее в *Animal, содержащемся внутри. Это просто синтаксический сахар, эквивалентный dog.animal.Hello() (если поле *Animal было названо, а не анонимно). Это не наследство!

Однако у вас уже есть *Dog, так что вы можете просто позвонить .Bark() по этому вопросу напрямую:

dog.Hello()
dog.Bark()

Предложения в комментариях по поводу интерфейсов также могут быть полезны, но в этом игрушечном примере сложно сказать, чего вы пытаетесь достичь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...