0

TLDR これは、実行しようとした場合に問題を示すプレイグラウンドです: https://play.golang.org/p/myQtUVg1iq

私は REST API を作成しており、GET 要求を介して取得できる多くの種類のリソースがあります。

GET http://localhost/api/users
GET http://localhost/api/groups

さまざまなリソースがどのように実装されているかを抽象化するモデル パッケージがあります。

func(m *UserManager) Get() []Users {
    // Internal logic, assume returns correct results
}

func(m *GroupManager) Get() []Groups {
    // Internal logic, assume returns correct results
}

ルート ファイルは、すべてのルートとハンドラーをセットアップします。

users := models.UserManager{}
groups := models.GroupManager{}

func GetUsersHandler (w http.ResponseWriter, r *http.Request) {
    users := users.Get()
    // Implementation details, writing to w as JSON
}

func GetGroupsHandler (w http.ResponseWriter, r *http.Request) {
    groups := groups.Get()
    // Implementation details, writing to w as JSON
}

func registerRoutes(r *mux.Router) {
    r.handleFunc("/api/users", GetUsersHandler).Method("GET")
    r.handleFunc("/api/groups", GetGroupsHandler).Method("GET")
}

インターフェイスを作成し、単一の GetHandler のみを必要とすることで、これをより一般的なものにしようとしています。このようなもの:

type Getter interface {
    Get() []interface{}
}

func GetHandler(g Getter) {
    return func(w http.ResponseWriter, r *http.Request) {
        results := g.Get()
        // Implementation details, writing to w as JSON
    }
}

func registerRoutes(r *mux.Router) {
    r.handleFunc("/api/users", GetHandler(&users)).Method("GET")
    r.handleFunc("/api/groups", GetHandler(&groups)).Method("GET")
}

これは本当に動作に近いです。唯一の問題は、モデルからの戻り値の型が特定のオブジェクト型であることですが、インターフェイスはインターフェイスの戻り値の型を使用しているだけです。モデルを返さずにこれを解決する方法はあります[]interface{}か?

https://play.golang.org/p/myQtUVg1iq

4

2 に答える 2

0

最終的にこの問題を完全に回避し、コード量を減らそうとする代わりにgo generate、Go 1.4 の新機能を使用して各リソースに必要なコードを作成しています。

于 2015-01-15T15:45:28.437 に答える