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

J'ai mis en œuvre toutes les quatre méthodes de l'interface ResourceController, mais il me dit:Pourquoi mon code Go ne fonctionne-t-il pas?

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

Répondre

4

Il est dans le message d'erreur: (Create method requires pointer receiver)

Vous avez défini Créer sur *AppController (pointeur sur un AppController), mais vous essayez d'utiliser un AppController, ce qui ne satisfait pas l'interface.

La solution que vous voulez sans doute est de changer controler := AppController{} à controler := &AppController{}

2

Comme le dit cthom06, la réponse est dans l'erreur.

La raison du message d'erreur est que vous avez seulement implémenté ResourceController lorsque vous passez un pointeur et non une valeur.

Lorsque vous avez mis en Show, Create, etc., vous avez utilisé

func (self *AppController)... 

Cela nécessite la méthode pour obtenir un récepteur de pointeur, mais AddResources est donnée la valeur de controler, pas le pointeur.

Voici quelques exemples de code pour montrer le problème:

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

également "ResourceHandler" est dépréciée. Je recommande d'utiliser l'API v3:

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-auteur reste

Questions connexes