为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
潇潇雨雨 2021-06-03 17:25:19
package mainimport (    "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)
查看完整描述

3 回答

?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

它在错误消息中: (Create method requires pointer receiver)

您已经在*AppController(指向 AppController 的指针)上定义了 Create ,但是您正在尝试使用AppController不满足接口的 。

您可能想要的解决方案是更改controler := AppController{}controler := &AppController{}


查看完整回答
反对 回复 2021-06-07
?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

正如 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

}


查看完整回答
反对 回复 2021-06-07
?
倚天杖

TA贡献1828条经验 获得超3个赞

不推荐使用“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 作者


查看完整回答
反对 回复 2021-06-07
  • 3 回答
  • 0 关注
  • 269 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信