Json Q:golang指向映射[string]接口{}的指针

Json Q:golang指向映射[string]接口{}的指针,json,pointers,dictionary,go,interface,Json,Pointers,Dictionary,Go,Interface,我(golang新手)正在尝试在函数中创建映射[string]接口{}。代码编译并运行,但映射为空 package main import ( "fmt" "encoding/json" ) func main() { var f interface{} var sJson string // JSON string from VT var err error

我(golang新手)正在尝试在函数中创建映射[string]接口{}。代码编译并运行,但映射为空

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"
}

因此,我认为我的问题在于映射的类型是interface,而不是string,但我不知道为什么第一个代码不起作用,而第二个代码起作用。

这里有一些东西会引起混淆:

  • 你根本不需要
    b
    。您正在传递一个指向要在函数中重新分配的字节片的指针。直接使用字符串即可
  • 我们不需要指向
    sJson
    字符串的指针。字符串是不可变的,您不会尝试重新分配
    sJson
    变量
  • 您正在解组一个空接口,然后尝试将
    myMap
    变量重新分配给
    f
    的内容。由于
    myMap
    不是指针,因此该赋值仅限于函数内。只需直接解组到myMap中
如果您更改了这些内容,您会发现
json2map
函数最后只剩下一行,可以完全删除:

func json2map(sJson string, myMap map[string]interface{}) error {
    return json.Unmarshal([]byte(sJson), &myMap)
}

这里有很多东西会引起混乱:

  • 你根本不需要
    b
    。您正在传递一个指向要在函数中重新分配的字节片的指针。直接使用字符串即可
  • 我们不需要指向
    sJson
    字符串的指针。字符串是不可变的,您不会尝试重新分配
    sJson
    变量
  • 您正在解组一个空接口,然后尝试将
    myMap
    变量重新分配给
    f
    的内容。由于
    myMap
    不是指针,因此该赋值仅限于函数内。只需直接解组到myMap中
如果您更改了这些内容,您会发现
json2map
函数最后只剩下一行,可以完全删除:

func json2map(sJson string, myMap map[string]interface{}) error {
    return json.Unmarshal([]byte(sJson), &myMap)
}

非常感谢你!!!这帮我解决了问题!(然而,我仍然不明白为什么我的其他代码不起作用,但我希望我能理解,一旦我不再是golang的新手。)@user208383:你似乎在指针的工作原理上遇到了障碍,而不仅仅是具体的问题。试着通过有可能对你有帮助的例子的工作。非常感谢!!!这帮我解决了问题!(然而,我仍然不明白为什么我的其他代码不起作用,但我希望我能理解,一旦我不再是golang的新手。)@user208383:你似乎在指针的工作原理上遇到了障碍,而不仅仅是具体的问题。试着通过有可能对您有帮助的示例的。