亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么我的 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 關注
  • 311 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號