为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
米琪卡哇伊 2023-05-22 15:48:32
关于如何在运行时确定对象类型的一些现有答案..god help usif reflect.TypeOf(err) ==  string { }那不编译if reflect.TypeOf(err) ==  "string" { }那个或这个都没有:if reflect.TypeOf(err).Kind() ==  "string" { }我们如何做到这一点?如果我使用其中一个答案给出的 typeof 函数,我会得到:
查看完整描述

2 回答

?
慕勒3428872

TA贡献1848条经验 获得超6个赞

比较像字符串


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

    fmt.Println("hello")

}

或者使用类型断言


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

}


查看完整回答
反对 回复 2023-05-22
?
MM们

TA贡献1886条经验 获得超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

}

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


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

}


查看完整回答
反对 回复 2023-05-22
  • 2 回答
  • 0 关注
  • 137 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信