如何在 Go 中使用反射获取地图接口的值?

  • 本文关键字:地图 获取 接口 反射 Go go
  • 更新时间 :
  • 英文 :


我正在努力在Go中获取接口映射的值。

val := reflect.ValueOf(Schema)
fmt.Println("VALUE = ", val)
fmt.Println("KIND = ", val.Kind())
if val.Kind() == reflect.Map {
fmt.Println("len = ", val.Len())
for key, element := range val.MapKeys() {
fmt.Println(key, element) // how to get the value?
}
}

这输出:

VALUE =  map[testString:foobar testInt:1 testBoolean:true testNumber:1 testDateTime:2017-10-06 08:15:30 +0100 +0100]
KIND =  map
len =  5
0 testString
1 testInt
2 testBoolean
3 testNumber
4 testDateTime

我的问题
如何获取地图项目的类型和值?

您很接近,您可以使用返回的键MapKeys然后使用MapIndex获取映射键的值。下面我使用 switch 语句将接口的值转换为正确的类型。

package main
import (
"fmt"
"reflect"
)
func main() {
Schema := map[string]interface{}{}
Schema["int"] = 10
Schema["string"] = "this is a string"
Schema["bool"] = false
val := reflect.ValueOf(Schema)
fmt.Println("VALUE = ", val)
fmt.Println("KIND = ", val.Kind())
if val.Kind() == reflect.Map {
for _, e := range val.MapKeys() {
v := val.MapIndex(e)
switch t := v.Interface().(type) {
case int:
fmt.Println(e, t)
case string:
fmt.Println(e, t)
case bool:
fmt.Println(e, t)
default:
fmt.Println("not found")
}
}
}
}

程序输出:

VALUE =  map[int:10 string:this is a string bool:false]
KIND =  map
int 10
string this is a string
bool false

最新更新