Go中反射创建map需用reflect.MakeMap而非reflect.New,先用reflect.MapOf构造map类型,再调用MakeMap生成空map值,最后通过SetMapIndex动态设键值对。
Go 语言中,map 是引用类型,不能直接用 reflect.New 创建(它只适用于结构体、数组等可寻址类型)。正确方式是使用 reflect.MakeMap,它接收一个 reflect.Type(必须是 map 类型),返回对应的 reflect.Value。
你需要先构造出 map 的类型描述。例如想创建 map[string]int:
reflect.MapOf 构造类型:`reflect.MapOf(reflect.TypeOf("").Type, reflect.TypeOf(0).Type)`reflect.Type,不能传具体值或 interface{}拿到 map 类型后,调用 reflect.MakeMap 得到可操作的 Value:
m 是 reflect.Value,底层是空 mapm.Interface(),结果是 interface{},需断言:`m.Interface().(map[string]int`向反射 map 中插入数据,必须用 SetMapIndex,且 key 和 value 都需是 reflect.Value:
这是最常用场景,适合 JSON-like 动态结构:
mapType := reflect.MapOf(reflect.TypeOf("").Type, reflect.TypeOf((*interface{})(nil)).El
em().Type)
m := reflect.MakeMap(mapType)
m.SetMapIndex(reflect.ValueOf("age"), reflect.ValueOf(30))
m.SetMapIndex(reflect.ValueOf("active"), reflect.ValueOf(true))
result := m.Interface().(map[string]interface{})
// result == map[string]interface{}{"age":30, "active":true}