2013-03-28 67 views
-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) 
} 

我已经实现了所有的接口ResourceController的四种方法,但它告诉我:为什么我的Go代码不能运行?

./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

这是错误消息:(Create method requires pointer receiver)

您已经定义创建于*AppController(指针到一个AppController),但您试图使用AppController,这不符合接口。

你可能想解决的办法是改变controler := AppController{}controler := &AppController{}

2

由于cthom06说,答案是错误。

错误消息的原因是,当您传递指针而不是值时,您只实现了ResourceController

当你实现ShowCreate,等等,你用

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 
} 
0

而且 “ResourceHandler” 已经过时了。我会建议使用第3版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())) 

安托万 - 去 - JSON的REST作者

相关问题