为什么我的 Go 代码没有运行?

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)

}


我已经实现了 interface 的所有四种方法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)


潇潇雨雨
浏览 273回答 3
3回答

哆啦的时光机

它在错误消息中: (Create method requires pointer receiver)您已经在*AppController(指向 AppController 的指针)上定义了 Create ,但是您正在尝试使用AppController不满足接口的 。您可能想要的解决方案是更改controler := AppController{}为controler := &AppController{}

小怪兽爱吃肉

正如 cthom06 所说,答案就在错误中。错误消息的原因是您仅ResourceController在传递指针而不是值时才实现。当您实现Show,Create等时,您使用了func (self *AppController)...这需要该方法获取一个指针接收器,而是AddResources被赋予了价值 的controler,而不是指针。下面是一些示例代码来显示问题:package mainimport "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}

倚天杖

不推荐使用“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 作者
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go