问:golang 指向 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"

}

所以我认为我的问题与 map 是 interface 而不是 string 类型有关,但我不知道为什么第一个代码不起作用,而第二个代码起作用。


人到中年有点甜
浏览 144回答 1
1回答

慕慕森

这里有很多事情会引起混乱:你根本不需要b。您正在传递一个指向您在函数内重新分配的字节切片的指针。直接使用字符串即可。我们不需要指向sJson字符串的指针。字符串是不可变的,您不会尝试重新分配sJson变量。您正在解组到一个空接口,然后尝试将myMap变量重新分配给f. 由于myMap不是指针,该赋值仅作用于函数内。直接解组就可以了myMap如果您更改这些内容,您会发现该json2map函数最终只有一行,并且可以完全删除:func json2map(sJson string, myMap map[string]interface{}) error {     return json.Unmarshal([]byte(sJson), &myMap)     }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go