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{}か?