将GO映射转换为struct

时间:2016-04-23 05:08:54

标签: rest go struct

我想知道是否有将地图转换为GO中的结构。我遇到了名为map structure的包。但是,当我运行它时,我的结构没有得到我的map的值。我已经在下面发布了我的代码的相关位

package main

import (
    "encoding/json"
    "fmt"
    "log"
    "net/http"
    "strconv"

    "github.com/drone/routes"
    "github.com/mitchellh/mapstructure"
)

var Infos = []Info{}

type Info struct {
    Keyy   int    `json:"key"`
    Valuee string `json:"value"`
}

var m map[int]string
var outgoingJSON string
var x map[string]string

func main() {
    m = make(map[int]string)
    x = make(map[string]string)
    mux := routes.New()
    mux.Put("/:key1/:value1", PutData)

    mux.Get("/profile", GetProfile)
    http.Handle("/", mux)
    http.ListenAndServe(":3000", nil)
}
func PutData(w http.ResponseWriter, r *http.Request) {

    key_data := r.URL.Query().Get(":key1")
    value_data := r.URL.Query().Get(":value1")
    key2, err := strconv.Atoi(key_data)
    if err != nil {
        panic(err)
    } else {
        m[key2] = value_data
    }

    for key2, value_data := range m {
        log.Println(key2, value_data)
        log.Println(m)
        x[strconv.FormatInt(int64(key2), 10)] = value_data
        log.Println(x)
        var result Info
        err1 := mapstructure.Decode(x, &result)
        if err1 != nil {
            panic(err1)
        }
        Infos = append(Infos, result)
        //log.Println(key2,value_data)
        //  outgoingJSON, err := json.MarshalIndent(x,"","    ")
        //  if err != nil {
        //  panic(err)
        //    break
        //  }

    }
    w.WriteHeader(204)

    //log.Println(key_data)
}
func GetProfile(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")

    for _, p := range Infos {

        outgoingJSON, err := json.MarshalIndent(p, "", "    ")
        if err != nil {
            panic(err)
            break
        }
        w.WriteHeader(200)
        fmt.Fprint(w, string(outgoingJSON))
    }
}

我首先创建了一个map [int]字符串,将其转换为map [string]字符串,然后将其转换为我的struct。请帮忙。我的struct返回0作为键,返回null作为值。

输出:

{
    "key": "",
    "value": ""
}{
    "key": "",
    "value": ""

1 个答案:

答案 0 :(得分:0)

MapStructure使用与地图键同名的字段填充结构。您的示例生成零值({Key: 0, Value: ""},因为地图x中没有名称为KeyValue的键。

以下是否符合您的要求?

package main

import (
    "encoding/json"
    "fmt"
    "net/http"
    "strconv"

    "github.com/drone/routes"
)

// Infos is a slice of Info
var Infos = []Info{}

// Info is a Key, Value struct
type Info struct {
    Key   int    `json:"key"`
    Value string `json:"value"`
}

func main() {
    mux := routes.New()
    mux.Put("/:key1/:value1", PutData)

    mux.Get("/profile", GetProfile)
    http.Handle("/", mux)
    http.ListenAndServe(":3000", nil)
}

// PutData puts the new key,values in to Infos
func PutData(w http.ResponseWriter, r *http.Request) {

    keyData := r.URL.Query().Get(":key1")
    valueData := r.URL.Query().Get(":value1")
    key2, err := strconv.Atoi(keyData)
    if err != nil {
        panic(err)
    } else {
        Infos = append(Infos, Info{
            Key:   key2,
            Value: valueData,
        })
    }

    w.WriteHeader(204)

}

// GetProfile displays the Infos
func GetProfile(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")

    for _, p := range Infos {

        outgoingJSON, err := json.MarshalIndent(p, "", "    ")
        if err != nil {
            panic(err)
            break
        }
        w.WriteHeader(200)
        fmt.Fprint(w, string(outgoingJSON))
    }
}