Добрый день! <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 не распознает методы интерфейса. Можете помочь понять, в чем проблема?
Проблема заключается в том, что вы используете указатель на интерфейс в структуре `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 могут быть использованы непосредственно, и в большинстве случаев вы не должны использовать указатели на интерфейсы. На практике, когда у вас есть интерфейс, вам нужно просто хранить его как значение, а не как указатель, чтобы методы интерфейса были доступны.
Если не вдаваться в подробности, то - в <b>Go</b> интерфейсы это указатели, и в приведённом примере <b>*Repo</b> это указатель на указатель, поэтому и методов нет. <br/> <br/> Так что для хранения в структуре указателя а не значения будет достаточно указать в качестве типа просто интерфейс Repo, и не указатель на него.