反射类型比较

Rus*_*old 1 reflection go

map我想确保密钥的类型是string. Key()方法返回Type,我不确定检查它是否是string. 我唯一想到的是:

if v.Type().Key() == reflect.TypeOf("") {
    fmt.Print("It is string")
}
Run Code Online (Sandbox Code Playgroud)

这是正确的方法吗?

icz*_*cza 5

是的,如果密钥类型是 "exactly" ,您所做的报告string

但例如,如果键类型是具有string基础类型的自定义类型,如下例所示:

type mystr string
m := map[mystr]int{}
Run Code Online (Sandbox Code Playgroud)

那么密钥类型将不等于reflect.TypeOf("")

这取决于你是否想要这样。如果您也想接受上述地图类型,您可以检查键的类型是否等于reflect.String

if v.Type().Key() == reflect.TypeOf("") {
    fmt.Print("It is string")
}

if v.Type().Key().Kind() == reflect.String {
    fmt.Print("It is string kind")
}
Run Code Online (Sandbox Code Playgroud)

对于上面的map[mystr]int,这是输出(在Go Playground上尝试):

It is string kind
Run Code Online (Sandbox Code Playgroud)

(密钥不是 type 的string,但它是 kind 的string。)