Golang-json.Unmarshal

Golang json.Unmarshal

Map

json.Unmarshal 的时候,Map 必须要加上&

    m := make(map[string]json.RawMessage)
    err = json.Unmarshal([]byte(deployJson.Data.Marathon), &m)
package main

import (
    "fmt"
)

func mapFunc(m map[string]interface{}) {
    m = make(map[string]interface{})
    m["abc"] = "123"
}

func mapPtrFunc(mp *map[string]interface{}) {
    m := make(map[string]interface{})
    m["abc"] = "123"

    *mp = m
}

func main() {
    var m1, m2 map[string]interface{}
    mapFunc(m1)
    mapPtrFunc(&m2)

    fmt.Printf("%+v, %+v\n", m1, m2)
}
// output 
// map[], map[abc:123]
  • 首先,映射m1和m2都指向nil。

  • 调用mapFunc会将m1指向的值复制到m,结果m也将指向nil映射。

  • 如果在(1)中已经分配了 map ,则在(2)中,由m1指向的基础 map 数据结构的地址(不是m1的地址)将被复制到m。在这种情况下,m1和m都指向相同的 map 数据结构,因此m1也可以看到通过m修改 map 项。

  • 在mapFunc函数中,将分配新 map 并将其分配给m。无法将其分配给m1。

如果是指针:

  • 调用mapPtrFunc时,m2的地址将被复制到mp中。

  • 在mapPtrFunc中,将分配新 map 并将其分配给mp(不是mp)。由于mp是m2的指针,因此将新映射分配给mp将更改m2指向的值。请注意mp的值不变,即m2的地址。

slice 同理也需要

var slice []string
err := json.Unmarshal([]byte("[\"a\",\"b\",\"c\",\"d\"]"), &slice) //&slice

Last updated

Was this helpful?