«не может использовать x (переменная типа [struct]) как значение [interface] в присваивании», когда struct реализует интерфейс - PullRequest
0 голосов
/ 29 марта 2020

У меня есть интерфейс TagService со структурной реализацией. Они находятся в двух разных пакетах из-за So C. Я хочу создать экземпляр реализации и добавить его в другой обработчик структуры, который имеет поле типа интерфейса.

Это происходит в основном пакете:

package main

...

ts := &postgres.TagService{DB: db} 
var h http.Handler
h.TagService = ts

Однако при этой установке я получаю следующую ошибку в коде VS:

cannot use ts (variable of type *postgres.TagService) as *tagservice.TagService value in assignment

Структура обработчика :

type Handler struct {
    TagService *tagservice.TagService
}

Интерфейс:

package tagservice

type Tag struct {
    ID          int64
    Name        string
    Description string
}

type TagService interface {
    CreateTag(tag *Tag) (*Tag, error)
    GetTag(id int64) (*Tag, error)
    GetAllTags() ([]*Tag, error)
    UpdateTag(tag *Tag) (*Tag, error)
    DeleteTag(id int64) error
}

И реализация (Опущено удовольствие c тел)

package postgres

type TagService struct {
    DB *sql.DB
}

func (s *TagService) CreateTag(tag *tagservice.Tag) (*tagservice.Tag, error) {
...
}

func (s *TagService) GetTag(id int64) (*tagservice.Tag, error) {
...
}

func (s *TagService) GetAllTags() ([]*tagservice.Tag, error) {
...
}

func (s *TagService) UpdateTag(tag *tagservice.Tag) (*tagservice.Tag, error) {
...
}

func (s *TagService) DeleteTag(id int64) error {
...
}

Что я делаю не так? Заранее спасибо

1 Ответ

1 голос
/ 02 апреля 2020

Вы пытаетесь поместить указатель на интерфейс, а не просто интерфейс. Попробуйте

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