2015-11-24 3 views
1

I (golang newbie) пытаюсь создать карту [string] interfaces {} в функции. Код компилируется и запускается, но карта пуста.Q: golang pointer to map [string] interface {}

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, который описывает, как использовать карту [строка] строку. Этот код работает, как ожидалось:

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

Так что я думаю, что моя проблема связана с картой существа типа интерфейса вместо строки, но я не могу сказать, почему первый код не работает, а второй делает.

ответ

4

Там есть ряд вещей, вызывающих здесь путаница:

  • Вам не нужно b вообще. Вы передаете указатель на байтовый фрагмент, который вы переназначаете внутри функции. Просто используйте строку напрямую.
  • Нам не нужно указывать указатель на строку sJson. Строки неизменяемы, и вы не пытаетесь переназначить переменную sJson.
  • Вы не разбираетесь в пустом интерфейсе, а затем пытаетесь переназначить переменную myMap на содержимое f. Поскольку myMap не является указателем, это присвоение ограничено только функцией. Просто распаковать непосредственно в myMap

Если вы меняете те вещи, которые вы найдете функцию json2map заканчивает тем, что одна линия, и может быть отброшен в целом:

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

Большое спасибо !!! Это помогло мне решить проблему! (Тем не менее, я до сих пор не понимаю, почему мой другой код не работает, но я надеюсь, что я пойму, что как только я больше не буду новичком в golang.) – user208383

+0

@ user208383: Вы, кажется, спотыкаетесь как указатели работают больше, чем Go специально. Попробуйте выполнить [Tour Of Go] (http://tour.golang.org/welcome/1), в котором есть примеры, которые могут вам помочь. – JimB

Смежные вопросы