我(golang newbie)我试图在一个函数中创建一个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
我发现this article描述了如何使用map [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"
}
所以我认为我的问题与地图类型接口而不是字符串有关,但我不知道为什么第一个代码不起作用,而第二个代码不起作用。
答案 0 :(得分:5)
这里有许多引起混淆的事情:
b
。您将指针传递给您在函数内重新分配的字节切片。只需直接使用字符串即可。 sJson
字符串的指针。字符串是不可变的,您不会尝试重新分配sJson
变量。myMap
变量重新分配给f
的内容。由于myMap
不是指针,因此该赋值仅限于函数内。只需直接解组到myMap
如果你更改了这些内容,你会发现json2map
函数最终成为一行,并且可以完全删除:
func json2map(sJson string, myMap map[string]interface{}) error {
return json.Unmarshal([]byte(sJson), &myMap)
}