doujiang3997
doujiang3997
2018-05-08 12:10
浏览 35

使用反射在Go中创建地图

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

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • douzhi3586
    douzhi3586 2018-05-08 22:10
    已采纳

    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
    ", aMap.Interface(), aMap.Interface())
    
    }
    
    点赞 评论
  • doudie2693
    doudie2693 2018-05-09 02:11
    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)
        }
    
    }
    
    点赞 评论

相关推荐