2016-10-22 26 views
0

申し訳ありませんが、この質問は少し基本的です。 私はGolangインターフェイスを使ってCRUDの実装をより動的にしようとしています。モデルcategory Category多数で使用することができる実装したメソッドからインターフェイスを返す方法は?

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 
} 

を次のように それはアプリでモデルを表す構造体を示す方法を実装し、.etc tag Tagのインターフェースを実装しています。ここ

が簡略化されたハンドラ/コントローラ FUNCのUpdateHandlerある(C handler.context)エラー{ P:=新しい(models.Post) 戻り更新(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

それはに似て設計されている場合あなたの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

関連する問題