英文:
How to check variable type is map in Go language
问题
在Go语言中,你可以使用反射(reflection)来检查变量的类型是否为map。你可以使用reflect包中的TypeOf函数获取变量的类型,并使用Kind方法判断类型是否为map。下面是一个示例代码:
import (
"fmt"
"reflect"
)
func main() {
map1 := map[string]string{"name":"John","desc":"Golang"}
map2 := map[string]int{"apple":23,"tomato":13}
// 检查map1的类型
if reflect.TypeOf(map1).Kind() == reflect.Map {
fmt.Println("map1 is a map")
} else {
fmt.Println("map1 is not a map")
}
// 检查map2的类型
if reflect.TypeOf(map2).Kind() == reflect.Map {
fmt.Println("map2 is a map")
} else {
fmt.Println("map2 is not a map")
}
}
运行以上代码,输出结果将显示map1是一个map,而map2也是一个map。
英文:
map1 := map[string]string{"name":"John","desc":"Golang"}
map2 := map[string]int{"apple":23,"tomato":13}
so,How to check variable type is map in Go language?
答案1
得分: 19
你可以使用reflect.ValueOf()
函数来获取这些映射的值,然后从值中获取类型,其中包含一个Map
条目(reflect.Map
)。
这是一个更具体的示例,使用reflect.Map
进行比较:
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()
:
fmt.Println(reflect.TypeOf(map1))
fmt.Println(reflect.TypeOf(map2))
fmt.Println(reflect.TypeOf(slice1))
希望对你有帮助!
英文:
You can use the reflect.ValueOf() function to get the Value of those maps, and then get the Kind from the Value, which has a Map entry (reflect.Map
).
http://play.golang.org/p/5AUKxECqNA
http://golang.org/pkg/reflect/#Kind
Here's a more specific example that does the comparison with 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)
}
prints:
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
If you want to know the more specific map type, you can use reflect.TypeOf():
答案2
得分: -1
你可以使用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
反射在Go语言中是不被鼓励的。引用Rob Pike的话说,"清晰比聪明更好",而"反射从来都不清晰"。
英文:
You can use fmt
and avoid using reflection.
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))
Produces:
map1 is a map? true
https://play.golang.org/p/OVm-_jgz33r
Reflection is discouraged in Go. To quote Rob Pike,
"Clear is better than clever" and "Reflection is never clear."
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论