2016-10-22 9 views
0

Извините, если этот вопрос немного базовый. Я пытаюсь использовать интерфейсы 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 Он реализует методы, указывающие на структуры, которые представляют модели в приложении.

Вот упрощенный обработчик/контроллер FUNC UpdateHandler (с handler.context) Ошибка { р: = новый (models.Post) обратного обновления (р, с) }

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

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

Ваш интерфейс CRUD может быть лучше, если он предназначен похож на [this one] (https://godoc.org/github.com/sauerbraten/crudapi#Storage) –

+2

Вы действительно должны попробовать и придумать пример _minimal_. И пожалуйста: избавьтесь от пустого интерфейса. Независимо от того, что вы пытаетесь сделать, это будет неправильно, если сделать это с помощью 'interface {}'. – Volker

ответ

4

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

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