【问题标题】:Determine if type is a string using reflect使用反射确定类型是否为字符串
【发布时间】:2018-12-20 02:54:55
【问题描述】:

关于如何在运行时确定对象类型的一些现有答案..上帝帮助我们

if reflect.TypeOf(err) ==  string {

}

无法编译

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

}

既不这样也不这样:

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

}

我们如何做到这一点?

如果我使用答案之一给出的 typeof 函数,我会得到:

【问题讨论】:

  • 阅读您正在使用的软件包的文档:golang.org/pkg/reflect TypeOf 不返回字符串,Kind 也不返回。

标签: go go-reflect


【解决方案1】:

比较像字符串

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

或使用type assertions

type F = func()

func typeof(v interface{}) string {
    switch v.(type) {
    case int:
        return "int"
    case string:
        return "string"
    case F:
        return "F"
    //... etc
    default:
        return "unknown"
    }
}

然后

var f F
if typeof(f) == "F"{
    fmt.Println("hello F")
}

【讨论】:

  • 好的,谢谢,如果它是自定义类型呢?比如我有type F = func(),我想看看 TypeOf(err) 是不是 F?
  • 谢谢,有没有v.(type)会失败的情况?
  • 据我所知没有。
  • 完全支持类型断言。大多数时候使用反射并不会让你看起来更聪明。如果可以,请始终使用语言提供的结构。这看起来很像其中一种情况
  • 当我尝试这种技术时,我得到了一些非常时髦的东西,我想我会使用类型断言
【解决方案2】:

要使用反射比较类型,请比较 reflect.Type 值:

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
}

如果你想检查一个值是否是某种类型,那么使用type assertion

if _, ok := v.(string); ok {
   // v is a string
}

如果要将类型映射到字符串,请使用以 reflect.Type 为键的映射:

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")
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-24
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-16
    相关资源
    最近更新 更多