-2
package main

import (
    "fmt"
    "github.com/ant0ine/go-json-rest"
    "net/http"
)

type App struct {
    Id   string
    Name string
}

func GetApp(w *rest.ResponseWriter, req *rest.Request) {
    user := App{
        Id:   req.PathParam("id"),
        Name: "Antoine",
    }
    w.WriteJson(&user)
}

type MyResourceHandler struct {
    rest.ResourceHandler
}

type ResourceController interface {
    Show(w *rest.ResponseWriter, req *rest.Request)
    Create(w *rest.ResponseWriter, req *rest.Request)
    Update(w *rest.ResponseWriter, req *rest.Request)
    Delete(w *rest.ResponseWriter, req *rest.Request)
}

func (self *MyResourceHandler) AddResource(name string, c ResourceController) error {
    show_func := func(w *rest.ResponseWriter, r *rest.Request) {
        c.Show(w, r)
    }
    create_func := func(w *rest.ResponseWriter, r *rest.Request) {
        c.Create(w, r)
    }
    update_func := func(w *rest.ResponseWriter, r *rest.Request) {
        c.Update(w, r)
    }
    delete_func := func(w *rest.ResponseWriter, r *rest.Request) {
        c.Delete(w, r)
    }

    err := self.ResourceHandler.SetRoutes(
        rest.Route{"GET", fmt.Sprintf("/%s/:id", name), show_func},
        rest.Route{"POST", fmt.Sprintf("/%s", name), create_func},
        rest.Route{"PUT", fmt.Sprintf("/%s/:id", name), update_func},
        rest.Route{"DELETE", fmt.Sprintf("/%s/:id", name), delete_func},
    )
    return err
}

type AppController struct{}

func (self *AppController) Show(w *rest.ResponseWriter, r *rest.Request) {
    app := App{
        Id:   r.PathParam("id"),
        Name: "Antoine",
    }
    w.WriteJson(&app)
}

func (self *AppController) Create(w *rest.ResponseWriter, r *rest.Request) {
    app := App{
        Id:   r.PathParam("id"),
        Name: "Antoine",
    }
    w.WriteJson(&app)
}

func (self *AppController) Update(w *rest.ResponseWriter, r *rest.Request) {
    app := App{
        Id:   r.PathParam("id"),
        Name: "Antoine",
    }
    w.WriteJson(&app)
}

func (self *AppController) Delete(w *rest.ResponseWriter, r *rest.Request) {
    app := App{
        Id:   r.PathParam("id"),
        Name: "Antoine",
    }
    w.WriteJson(&app)
}

func main() {
    handler := MyResourceHandler{}
    controler := AppController{}
    handler.AddResource("app", controler)
    http.ListenAndServe(":9008", &handler)
}

interface の 4 つのメソッドをすべて実装しResourceControllerましたが、次のように表示されます。

./fakeapi.go:93: cannot use controler (type AppController) as type ResourceController in function argument:
    AppController does not implement ResourceController (Create method requires pointer receiver)
4

3 に答える 3

4

それはエラーメッセージにあります:(Create method requires pointer receiver)

Create on (AppController へのポインタ) を定義しましたが、インターフェイスを満たさない*AppControllerを使用しようとしています。AppController

おそらく必要な解決策は、に変更controler := AppController{}することですcontroler := &AppController{}

于 2013-03-28T12:24:27.120 に答える
2

cthom06 が言うように、答えはエラーにあります。

エラー メッセージの理由はResourceController、値ではなくポインターを渡す場合にのみ実装したためです。

Show、などを実装したときにCreate使用した

func (self *AppController)...

これには、メソッドがポインター レシーバーを取得する必要がありますが、ポインター ではなく のAddResourcesが与えられます。controler

問題を示すコードの例を次に示します。

package main

import "fmt"

type I interface {
    Show(i int)
}

type T struct{}

func (t *T) Show(i int) {
    fmt.Println(i)
}

func CallShow(i I) {
    i.Show(32);
}

func main() {
    obj := T{}

    // CallShow(obj) // This doesn't work unless you change func (t *T) to func (t T)
    CallShow(&obj) // This works because you pass a pointer
}
于 2013-03-28T12:39:12.720 に答える
0

また、「ResourceHandler」は非推奨です。v3 API を使用することをお勧めします。

api := rest.NewApi()
api.Use(rest.DefaultDevStack...)
router, err := rest.MakeRouter(
   // your routes here ...
)
if err != nil {
    log.Fatal(err)
}
api.SetApp(router)
log.Fatal(http.ListenAndServe(":8080", api.MakeHandler()))

Antoine - go-json-rest の作者

于 2015-07-28T03:38:57.577 に答える