反映类型比较

时间:2018-11-12 11:32:10

标签: go reflection

我想确保map键的类型是stringKey()方法返回Type,但我不确定哪种正确的方法来检查其是否为string。我唯一想到的是:

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

这是正确的方法吗?

2 个答案:

答案 0 :(得分:4)

是的,如果密钥类型为“完全” 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")
}

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

It is string kind

(密钥的类型不是string,但是类型是string。)

答案 1 :(得分:1)

您可以提取密钥的Kind并在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
}

如果要尝试,请参见此Go Playground snippet