![](/img/trans.png)
[英]golang json unmarshal part of map[string]interface{}
[英]Q: golang pointer to map[string]interface{}
我(golang新手)正在嘗試在函數中創建map [string] interfaces {}。 代碼可以編譯並運行,但是映射為空。
package main
import (
"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 main
import (
"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"
}
因此,我認為我的問題與映射的類型為接口而不是字符串有關,但我無法確定為什么第一個代碼不起作用而第二個代碼卻不起作用。
造成混亂的原因有很多:
b
。 您正在將指針傳遞給要在函數內部重新分配的字節片。 只需直接使用字符串即可。 sJson
字符串的指針。 字符串是不可變的,並且您沒有嘗試重新分配sJson
變量。 myMap
變量重新分配給f
的內容。 由於myMap
不是指針,因此該賦值僅作用於函數內。 只需直接將myMap
解組到myMap
如果更改了這些內容,您會發現json2map
函數最終json2map
一行,可以完全刪除:
func json2map(sJson string, myMap map[string]interface{}) error {
return json.Unmarshal([]byte(sJson), &myMap)
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.