Почему, когда тип реализует интерфейс, существует разница в поведении? - PullRequest
0 голосов
/ 21 мая 2018

Кто может сказать (или ссылку, где читать), почему, когда тип реализует интерфейс, существует различие в поведении (в зависимости от того, как передать получателя)?Вот так это работает:

type GetNamer interface {
  GetName()
}

type Person struct {
  PersonName string
}

func (p Person) GetName() {
  fmt.Println(p.PersonName)
}

type Data []GetNamer

var d = Data{
    Person{"Vasya"},
  }

Но, если я передаю получателю ссылку: (p * Person) Я получаю сообщение об ошибке, что типы (Person и GetNamer) не совпадают.

1 Ответ

0 голосов
/ 21 мая 2018

Причина в том, что когда вы изменяете подпись получателя на (p *Person), это означает, что *Person реализует интерфейс, а не Person, поэтому ваш массив "Data" должен быть изменен для соответствия.

То есть вы должны изменить сигнатуру метода интерфейса и содержимого переменной "d", чтобы она содержала указатели Person, и она должна работать, поскольку &Person{...} - это *Person, то есть GetNamer:

func (p *Person) GetName() {
  // ...
}

var d = Data{
  &Person{"Vasya"},
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...