我想知道是否有将地图转换为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": ""
答案 0 :(得分:0)
MapStructure使用与地图键同名的字段填充结构。您的示例生成零值({Key: 0, Value: ""}
,因为地图x
中没有名称为Key
和Value
的键。
以下是否符合您的要求?
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))
}
}