I'm just playing around trying to write a JSON reader wrapper in Golang that is pleasant to use like jsoncpp. Is it possible to create a map with a dynamic type in Golang?
For instance:
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
}
Am I dreaming?
Some people would say "That's why Go have the type interface{}
", however, I don't want be doing something like this:
myMap["key"].(map[string]string)["subKey1"].([]map[string]interface)["subKey2"].(int)
I want to do something like this:
myMap["key"]["subKey1"][0]["subKey2"]
Perhaps a good soul have already coded a wrapper like this before but I couldn't find it anywhere
Here is example to how to create dynamic map.
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())
}
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)
}
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.