如何检查变量类型是Go语言中的map

时间:2013-12-24 11:05:31

标签: go

map1 := map[string]string{"name":"John","desc":"Golang"}
map2 := map[string]int{"apple":23,"tomato":13}

那么,如何检查变量类型是Go语言中的映射?

2 个答案:

答案 0 :(得分:9)

您可以使用reflect.ValueOf()函数获取这些地图的值,然后从Value中获取Kind,其中包含Map条目(reflect.Map)。

http://play.golang.org/p/5AUKxECqNA

http://golang.org/pkg/reflect/#Kind

这是一个与reflect.Map进行比较的更具体的例子: http://play.golang.org/p/-qr2l_6TDq

package main

import (
   "fmt"
   "reflect"
)

func main() {
   map1 := map[string]string{"name": "John", "desc": "Golang"}
   map2 := map[string]int{"apple": 23, "tomato": 13}
   slice1 := []int{1,2,3}
   fmt.Printf("%v is a map? %v\n", map1, reflect.ValueOf(map1).Kind() == reflect.Map)
   fmt.Printf("%v is a map? %v\n", map2, reflect.ValueOf(map2).Kind() == reflect.Map)
   fmt.Printf("%v is a map? %v\n", slice1, reflect.ValueOf(slice1).Kind() == reflect.Map)
}

打印:

map[name:John desc:Golang] is a map? true
map[apple:23 tomato:13] is a map? true
[1 2 3] is a map? false

如果您想知道更具体的地图类型,可以使用reflect.TypeOf():

http://play.golang.org/p/mhjAAdgrG4

答案 1 :(得分:0)

您可以使用fmt并避免使用反射。

func isMap(x interface{}) bool {
    t := fmt.Sprintf("%T", x)
    return strings.HasPrefix(t, "map[")
}

map1 := map[string]string{"name": "John", "desc": "Golang"}
fmt.Printf("map1 is a map? %t", isMap(map1))

产地:

map1 is a map? true

https://play.golang.org/p/OVm-_jgz33r

Go中不鼓励反思。引用Rob Pike, “Clear is better than clever”和“Reflection is never clear.