Go 使用反射确定类型是否为字符串

Go 使用反射确定类型是否为字符串,go,go-reflect,Go,Go Reflect,关于如何在运行时确定对象的类型,这里有一些现有的答案..上帝保佑我们 if reflect.TypeOf(err) == string { } 那是不可编译的 if reflect.TypeOf(err) == "string" { } 这也不是: if reflect.TypeOf(err).Kind() == "string" { } 我们如何做到这一点 如果我使用其中一个答案给出的函数类型,我得到: 像字符串一样比较 if reflect.TypeOf(err).Stri

关于如何在运行时确定对象的类型,这里有一些现有的答案..上帝保佑我们

if reflect.TypeOf(err) ==  string {

}
那是不可编译的

if reflect.TypeOf(err) ==  "string" {

}
这也不是:

if reflect.TypeOf(err).Kind() ==  "string" {

}
我们如何做到这一点

如果我使用其中一个答案给出的函数类型,我得到:

像字符串一样比较

if reflect.TypeOf(err).String() == "string" {
    fmt.Println("hello")
}
或使用

然后


要使用反射比较类型,请比较反射。类型值:

var stringType = reflect.TypeOf("") // this can be declared at package-level

if reflect.TypeOf(v) == stringType {
    // v has type string
}
给定任意类型名X,可以使用以下方法构造类型:

var xType = reflect.TypeOf((*X)(nil)).Elem()

if reflect.TypeOf(v) == xType {
    // v has type X
}
如果要检查某个值是否为某种类型,请使用:

如果要将类型映射到字符串,请使用由reflect键控的映射。类型:

var typeName = map[reflect.Type]string{
    reflect.TypeOf((*int)(nil)).Elem():    "int",
    reflect.TypeOf((*string)(nil)).Elem(): "string",
    reflect.TypeOf((*F)(nil)).Elem():      "F",
}

...

if n, ok := typeName[reflect.TypeOf(f)]; ok {
    fmt.Println(n)
} else {
    fmt.Println("other")
}

好的,谢谢,如果是自定义类型呢?比如,如果我有F=func类型,我想看看TypeOferr是否是F?谢谢,有没有任何情况下v.type会失败?正如我所知道的,没有。完全使用类型断言。大多数时候,使用反射并不能让你看起来更聪明。如果可以,请始终使用提供的语言构造。这看起来就像是其中的一个案例当我尝试这项技术时,我得到了一些非常有趣的东西,我想我将使用类型断言阅读您正在使用的包的文档:TypeOf不返回字符串,Kind也不返回。
var xType = reflect.TypeOf((*X)(nil)).Elem()

if reflect.TypeOf(v) == xType {
    // v has type X
}
if _, ok := v.(string); ok {
   // v is a string
}
var typeName = map[reflect.Type]string{
    reflect.TypeOf((*int)(nil)).Elem():    "int",
    reflect.TypeOf((*string)(nil)).Elem(): "string",
    reflect.TypeOf((*F)(nil)).Elem():      "F",
}

...

if n, ok := typeName[reflect.TypeOf(f)]; ok {
    fmt.Println(n)
} else {
    fmt.Println("other")
}