簡體   English   中英

問:golang指向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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM