Как вернуть интерфейс из метода, который он реализовал?

Извините, если этот вопрос немного базовый. Я пытаюсь использовать интерфейсы Golang, чтобы сделать реализацию CRUD более динамичной. Я реализовал интерфейс следующим образом

type Datastore interface {
    AllQuery() ([]interface{}, error)
    ReadQuery() ([]interface{}, error)
    UpdateQuery() ([]interface{}, error)
    CreateQuery() ([]interface{}, error)
    DestroyQuery() ([]interface{}, error)//Im not sure if the return value implementation is correct
}

Это может быть использовано с множеством моделей category Category,tag Tag.etc Он реализует методы, указывающие на структуры, которые представляют модели в приложении.

Вот упрощенная функция обработчика / контроллера UpdateHandler(c handler.context) error { p:= new(models.Post) return Update(p,c) }

Это функция, реализующая интерфейс

  func Update(data Datastore,c handler.context) error{
        if err := c.Bind(data); err != nil {
              log.Error(err)
        }
        d, err := data.UpdateQuery()
        //stuff(err checking .etc)
        return c.JSON(fasthttp.StatusOK, d)///the returned value is used here
    }

Это метод, который я использую для запроса базы данных

func (post Post) UpdateQuery() ([]interface{}, error){
//run query using the 
return //I dont know how to structure the return statement
}

Как мне структурировать интерфейс выше и методы, которые он реализует, чтобы я мог вернуть результат запроса обратно к реализующей функции. Пожалуйста, дайте мне знать, если мне нужно что-то добавить к вопросу или улучшить его, я постараюсь сделать это быстро. Спасибо!

1 ответ

Я думаю, что вы должны хранить возвращаемое значение в переменной. Также убедитесь, что это возвращаемое значение (результат) является частью интерфейса. Если это не так, то конвертируйте его

v := reflect.ValueOf(s)
intf := make([]interface{}, v.Len())

В вашем случае ваша функция UpdateQuery может выглядеть так

func (post Post) UpdateQuery() (interface{}, bool) {

    result,err := []Struct{}

    return result, err
}

Демо: https://play.golang.org/p/HOU56KibUd

Другие вопросы по тегам