2014-06-11 3 views
12

Я полный новичок в go, начатый несколько дней назад. Я хочу подключиться к mongodb, искать, создавать сервис и использовать его для углового. Я сделал почти все, но у меня проблема с json.marshal(). Может кто-нибудь сказать мне, что я делаю неправильно, или есть лучший способ? ТНХ :)Я застрял в json.marshal в go

Ошибка "./main.go:96: множественное значение json.Marshal() в контексте одного значения"

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 
} 

ответ

34

Посмотрите документацию для этой функции: http://golang.org/pkg/encoding/json/#Marshal

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

Он возвращает два значения. Проблема здесь заключается в том, что вы просто дать ему одну переменную, чтобы получить эти два значения:

b := json.Marshal(result) 

Таким образом, вы просто должны исправить это следующим образом:

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

ДА, ТНХ человек, которого вы спасли меня еще несколько часов : DI примет ваш ответ за несколько минут – Arcagully

Смежные вопросы