【问题标题】:Q: golang pointer to map[string]interface{}问:golang 指向 map[string]interface{} 的指针
【发布时间】:2016-02-27 00:04:43
【问题描述】:

我(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

我找到了this article,它描述了如何使用 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"
}

所以我认为我的问题与映射类型为接口而不是字符串有关,但我不知道为什么第一个代码不起作用,而第二个代码起作用。

【问题讨论】:

    标签: json pointers dictionary go interface


    【解决方案1】:

    这里有很多引起混淆的事情:

    • 你根本不需要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:您似乎对指针的工作方式比 Go 更具体。尝试通过Tour Of Go 工作,其中包含可能对您有所帮助的示例。
    猜你喜欢
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    • 2021-01-02
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多