I'm struggling to get the value of an interface map in 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?
}
}
This outputs:
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
My question:
How can I get the type and value of the map items?
You were close, you can use the key returned form MapKeys
and then use MapIndex
to get the value of the map key. Below I use a switch statement to convert the value of the interface to the correct type.
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")
}
}
}
}
Program Output:
VALUE = map[int:10 string:this is a string bool:false]
KIND = map
int 10
string this is a string
bool false