Почему на интерфейсе по указанной ссылке не отображаются его методы?

Добрый день! <br/> <br/> У меня есть следующий код: <br/> <br/> <pre><code class="go">type Repo interface {
	Create(data interface{}) interface{}
}

type Service struct {
	Repository *Repo
}

type User struct {
	Name string
}

func (r *Service) Do(user User) {
	r.Repository.Create(user)
}</code></pre> <br/> <br/> В методе: <br/> <br/> <pre><code class="go">func (r *Service) Do(user User) {
	r.Repository.Create(user)
}</code></pre> <br/> <br/> я заметил, что r.Repository не распознает методы интерфейса. Можете помочь понять, в чем проблема?
  • 23 ноября 2024 г. 15:23
Ответы на вопрос 2
Проблема заключается в том, что вы используете указатель на интерфейс в структуре `Service`. В вашем коде `Repository` объявлен как `*Repo`, что является указателем на интерфейс, в то время как на самом деле вам нужно использовать интерфейс напрямую. 

Вот исправленная версия вашего кода:

```go
type Repo interface {
    Create(data interface{}) interface{}
}

type Service struct {
    Repository Repo // Измените здесь на Repo, а не *Repo
}

type User struct {
    Name string
}

func (r *Service) Do(user User) {
    r.Repository.Create(user)
}
```

Теперь, когда `Repository` объявлен как `Repo` (интерфейс, а не указатель на интерфейс), метод `Create` будет доступен через `r.Repository`.

Интерфейсы в Go могут быть использованы непосредственно, и в большинстве случаев вы не должны использовать указатели на интерфейсы. На практике, когда у вас есть интерфейс, вам нужно просто хранить его как значение, а не как указатель, чтобы методы интерфейса были доступны.
Если не вдаваться в подробности, то - в Go интерфейсы это указатели, и в приведённом примере *Repo это указатель на указатель, поэтому и методов нет. 

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