создать карту в Go, используя отражение - PullRequest
0 голосов
/ 08 мая 2018

Я просто пытаюсь написать оболочку для чтения JSON на Голанге, которую приятно использовать, например, jsoncpp. Можно ли создать карту с динамическим типом в Голанге?

Например:

package main

import  "reflect"

func main() {
    i := 1                       // type int
    myType := reflect.TypeOf(i)  // type Type
    a := make(map[string]myType) // make a map of Type
    a["KEY"] = i                 // Assign an int to the map
}

Я сплю?

Некоторые люди говорят: «Вот почему у Go есть тип interface{}», однако я не хочу делать что-то вроде этого:

myMap["key"].(map[string]string)["subKey1"].([]map[string]interface)["subKey2"].(int)

Я хочу сделать что-то вроде этого:

myMap["key"]["subKey1"][0]["subKey2"]

Возможно, хорошая душа уже кодировала обертку, подобную этой, но я нигде не смог ее найти

Ответы [ 2 ]

0 голосов
/ 09 мая 2018
package main

import (
    "fmt"
    "reflect"
)



func main() {
    key := 1
    value := "abc"

    mapType := reflect.MapOf(reflect.TypeOf(key), reflect.TypeOf(value))

    mapValue := reflect.MakeMap(mapType)
    mapValue.SetMapIndex(reflect.ValueOf(key), reflect.ValueOf(value))
    mapValue.SetMapIndex(reflect.ValueOf(2), reflect.ValueOf("def"))
    mapValue.SetMapIndex(reflect.ValueOf(3), reflect.ValueOf("gh"))

    keys := mapValue.MapKeys()
    for _, k := range keys {
        c_key := k.Convert(mapValue.Type().Key())
        c_value := mapValue.MapIndex(c_key)
        fmt.Println("key :", c_key, " value:", c_value)
    }

}
0 голосов
/ 09 мая 2018

Вот пример того, как создать динамическую карту.

package main

import (
    "reflect"
    "fmt"
)

func main() {

    var key = "key1"
    var value = 123

    var keyType = reflect.TypeOf(key)
    var valueType = reflect.TypeOf(value)
    var aMapType = reflect.MapOf(keyType, valueType)
    aMap := reflect.MakeMapWithSize(aMapType, 0)
    aMap.SetMapIndex(reflect.ValueOf(key), reflect.ValueOf(value))
    fmt.Printf("%T:  %v\n", aMap.Interface(), aMap.Interface())

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...