我(golang 新手)正在尝试在函数中创建一个 map[string]interfaces{}。代码编译并运行,但地图为空。package mainimport ( "fmt" "encoding/json" )func main() { var f interface{} var sJson string // JSON string from VT var err error // errors var b []byte // bytearray of JSON string var rootMap map[string]interface{} rootMap = make(map[string]interface{}) sJson=`{"key": "foo"}` fmt.Println(sJson) err = json2map(&b, &sJson, f, rootMap) if err != nil { return } switch v := rootMap["key"].(type) { case float64: fmt.Printf("Value: %d",v) case string: fmt.Printf("Value: %s", v) case nil: fmt.Println("key is nil") default: fmt.Println("type is unknown") } }func json2map(b *[]byte, sJson *string, f interface{}, myMap map[string]interface{}) error { var err error *b = []byte(*sJson) err = json.Unmarshal(*b,&f) myMap = f.(map[string]interface{}) return err}输出是:{"key": "foo"}key is nil我发现这篇文章描述了如何使用 map[string]string。此代码按预期工作:package mainimport ( "fmt")type MyType struct { Value1 int Value2 string}func main() { myMap := make(map[string]string) myMap["key"] = "foo" ChangeMyMap(myMap) fmt.Printf("Value : %s\n", myMap["key"]) }func ChangeMyMap(TheMap map[string]string) { TheMap["key"] = "bar"}所以我认为我的问题与 map 是 interface 而不是 string 类型有关,但我不知道为什么第一个代码不起作用,而第二个代码起作用。
1 回答
慕慕森
TA贡献1856条经验 获得超17个赞
这里有很多事情会引起混乱:
你根本不需要
b
。您正在传递一个指向您在函数内重新分配的字节切片的指针。直接使用字符串即可。我们不需要指向
sJson
字符串的指针。字符串是不可变的,您不会尝试重新分配sJson
变量。您正在解组到一个空接口,然后尝试将
myMap
变量重新分配给f
. 由于myMap
不是指针,该赋值仅作用于函数内。直接解组就可以了myMap
如果您更改这些内容,您会发现该json2map
函数最终只有一行,并且可以完全删除:
func json2map(sJson string, myMap map[string]interface{}) error { return json.Unmarshal([]byte(sJson), &myMap) }
- 1 回答
- 0 关注
- 143 浏览
添加回答
举报
0/150
提交
取消