遍历Golang地图

Jor*_*ero 2 go

我初始化了一个名为data的变量,如下所示:

   var data interface{}
Run Code Online (Sandbox Code Playgroud)

然后我把原始的json解组成了.

   err = json.Unmarshal(raw, &data)
Run Code Online (Sandbox Code Playgroud)

我在它上面运行了这两个函数:

   fmt.Println(reflect.TypeOf(data))
   fmt.Println(data)
Run Code Online (Sandbox Code Playgroud)

那些归还:

   map[string]interface {}
   map[tasks:[map[payload:map[key:36A6D454-FEEE-46EB-9D64-A85ABEABBCB7] code_name:image_resize]]]
Run Code Online (Sandbox Code Playgroud)

我需要访问"密钥".我尝试了这些方法以及其他一些方法:

   data["tasks"][0]["payload"]["key"]
   data[0][0][0][0]
Run Code Online (Sandbox Code Playgroud)

这些都给了我一个类似于这个的错误:

    ./resize.go:44: invalid operation: data["tasks"] (index of type interface {})
Run Code Online (Sandbox Code Playgroud)

关于如何从这个界面中获取"关键"值的任何建议?提前致谢.

Ste*_*erg 9

由于您已经了解了模式,因此最好的方法是直接解组为可以使用的结构.

http://play.golang.org/p/aInZp8IZQA

package main

import (
    "encoding/json"
    "fmt"
)

type msg struct {
    Tasks []task `json:"tasks"`
}

type task struct {
    CodeName string  `json:"code_name"`
    Payload  payload `json:"payload"`
}

type payload struct {
    Key string `json:"key"`
}

func main() {
    var data msg
    raw := `{ "tasks": [ { "code_name": "image_resize", "payload": { "key": "36A6D454-FEEE-46EB-9D64-A85ABEABBCB7" } } ] }`

    err := json.Unmarshal([]byte(raw), &data)
    if err != nil {
        fmt.Println(err)
        return
    }

    fmt.Println(data.Tasks[0].Payload.Key)
}
Run Code Online (Sandbox Code Playgroud)

如果您坚持使用原始代码进行艰难的操作,则需要键入断言.我强烈建议尽可能避免这条路线.这不好玩.需要检查每个步骤以确保它与您期望的数据结构相匹配.

http://play.golang.org/p/fI5sqKV19J

if m, ok := data.(map[string]interface{}); ok {
    if a, ok := m["tasks"].([]interface{}); ok && len(a) > 0 {
        if e, ok := a[0].(map[string]interface{}); ok {
            if p, ok := e["payload"].(map[string]interface{}); ok {
                if k, ok := p["key"].(string); ok {
                    fmt.Println("The key is:", k)
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

回应Goodwine的问题:你可以通过阅读编码/ json godoc来进一步阅读如何编组和解组.我建议从这里开始: