2014-06-11 9 views
12

Ich bin komplett Neuling in gehen, vor ein paar Tagen gestartet. Ich möchte eine Verbindung zu mongodb herstellen, suchen, einen Dienst erstellen und für eckige verwenden. Ich habe fast alles gemacht, aber ich habe ein Problem mit json.marshal(). Kann mir jemand sagen, was mache ich falsch oder gibt es einen besseren Weg? thx :)Ich bin mit json.marshal stecken in gehen

Der Fehler ist "./main.go:96: Mehrwert json.Marshal() in Einzelwert Kontext"

package main 

import (
    "encoding/json" 
    "flag" 
    "fmt" 
    "github.com/gorilla/mux" 
    "labix.org/v2/mgo" 
    "labix.org/v2/mgo/bson" 
    "log" 
    "net/http" 
) 

type warrior struct { 
    Name  string  `json:"name"` 
    LowDamage int   `json:"low_damage"` 
    HighDamage int   `json:"high_damage"` 
    Health  int   `json:"health"` 
    HealthLeft int   `json:"health_left"` 
    Armor  int   `json:"armor"` 
    Id   bson.ObjectId "_id,omitempty" 
} 

func getWarriors(w http.ResponseWriter, r *http.Request) { 
    w.Header().Set("Content-Type", "application/json") 
    w.WriteHeader(200) 
    w.Write(mongo()) 
} 

func main() { 

    // command line flags 
    port := flag.Int("port", 5001, "port to serve on") 
    dir := flag.String("random message 1", "web/", "random message 2") 
    flag.Parse() 

    // handle all requests by serving a file of the same name 
    fs := http.Dir(*dir) 
    fileHandler := http.FileServer(fs) 

    // ROUTES 
    router := mux.NewRouter() 
    router.Handle("/", http.RedirectHandler("/static/", 302)) 
    router.HandleFunc("/warriors", getWarriors).Methods("GET") 
    router.PathPrefix("/static/").Handler(http.StripPrefix("/static", fileHandler)) 
    http.Handle("/", router) 

    log.Printf("Running on port %d\n", *port) 

    addr := fmt.Sprintf("127.0.0.1:%d", *port) 
    err := http.ListenAndServe(addr, nil) 
    fmt.Println(err.Error()) 
} 

func mongo() []byte { 

    session, err := mgo.Dial("mongodb://localhost:27017/test") 
    if err != nil { 
     panic(err) 
    } 
    defer session.Close() 

    // Optional. Switch the session to a monotonic behavior. 
    session.SetMode(mgo.Monotonic, true) 

    // select dm + table name 
    c := session.DB("test").C("warriors") 

    e := warrior{ 
     Name:  "first event", 
     LowDamage: 2, 
     HighDamage: 4, 
     Health:  40, 
     HealthLeft: 40, 
     Armor:  1, 
    } 

    // insert data 
    err = c.Insert(e) 
    if err != nil { 
     panic(err) 
    } 

    // search show results []warrior{} for all warrior{} 
    result := []warrior{} 
    // err = c.Find(bson.M{"name": "first event"}).One(&result) 
    err = c.Find(bson.M{"name": "first event"}).Limit(10).All(&result) 
    if err != nil { 
     panic(err) 
    } 

    b := json.Marshal(result) 

    log.Println("JSON:", result) 
    return b 
} 

Antwort

34

Blick auf die Dokumentation dieser Funktion: http://golang.org/pkg/encoding/json/#Marshal

func Marshal(v interface{}) ([]byte, error) 

Es gibt zwei Werte zurück. Das Problem hier ist, dass man es nur eine Variable geben, diese beiden Werte zu erhalten:

b := json.Marshal(result) 

Also muss man es nur auf diese Weise korrigieren:

b, err := json.Marshal(result) 
+1

YES, thx Mann, den du mich gerettet noch ein paar Stunden : DI akzeptiert Ihre Antwort in wenigen Minuten – Arcagully