Go 反映类型比较

Go 反映类型比较,go,reflection,Go,Reflection,我想确保map键的类型是stringKey()。我唯一想到的是: if v.Type().Key() == reflect.TypeOf("") { fmt.Print("It is string") } 这是正确的方法吗?您可以提取密钥的种类,并在reflect包(如reflect.String中使用种类枚举来对抗它,如下所示: package main import ( "fmt" "reflect" ) func main() { obj := ma

我想确保
map
键的类型是
string
Key()。我唯一想到的是:

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

这是正确的方法吗?

您可以提取密钥的
种类
,并在
reflect
包(如
reflect.String
中使用种类枚举来对抗它,如下所示:

package main

import (
    "fmt"
    "reflect"
)

func main() {

    obj := make(map[string]interface{})

        fmt.Println(reflect.TypeOf(obj).Key().Kind() == reflect.String) // It will print true
}

如果您想尝试,请查看此项。

您可以提取密钥的
种类
,并在
reflect
包中使用种类枚举,如
reflect.String

package main

import (
    "fmt"
    "reflect"
)

func main() {

    obj := make(map[string]interface{})

        fmt.Println(reflect.TypeOf(obj).Key().Kind() == reflect.String) // It will print true
}

如果您想尝试,请查看此项。

是的,您所做的操作会报告密钥类型是否为“精确”
string

但例如,如果键类型是一个自定义类型,其底层类型为
string
,如本例所示:

type mystr string
m := map[mystr]int{}
那么键类型将不等于
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")
}
对于上面的
映射[mystr]int
,这是输出(在上尝试):


(键的类型不是
string
,而是
string

是的,如果键的类型是“精确的”
string
,您所做的将报告

但例如,如果键类型是一个自定义类型,其底层类型为
string
,如本例所示:

type mystr string
m := map[mystr]int{}
那么键类型将不等于
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")
}
对于上面的
映射[mystr]int
,这是输出(在上尝试):


(键不是类型
string
,而是种类
string

你在找种类吗?@Volker如我所说,我只想确保键是一根string你在找种类吗?@Volker如我所说,我只想确保键是一根字符串