验证reflect.Type for int和float64的其他方法

时间:2016-07-15 06:45:06

标签: go reflection types casting

在golang中,JSON消息中的数字总是被解析为float64。 为了检测它是否实际上是整数,我使用reflect.TypeOf()来检查它的类型。 不幸的是,没有代表reflect.Type的常量。

intType := reflect.TypeOf(0)
floatType := reflect.TypeOf(0.0)
myType := reflect.TypeOf(myVar)
if myType == intType {
    // do something
}

是否有更优雅的解决方案,而不是使用0或0.0来获取reflect.Type

2 个答案:

答案 0 :(得分:6)

您还可以使用Value.Kind()Type.Kind()方法,其可能的值在reflect包中以Kind类型的文档列为常量。

myType := reflect.TypeOf(myVar)
if k := myType.Kind(); k == reflect.Int {
    fmt.Println("It's of type int")
} else if k == reflect.Float64 {
    fmt.Println("It's of type float64")
}

您也可以在switch

中使用它
switch myType.Kind() {
case reflect.Int:
    fmt.Println("int")
case reflect.Float64:
    fmt.Println("float64")
default:
    fmt.Println("Some other type")
}

请注意,reflect.Typereflect.Value都有Kind()方法,因此如果您从reflect.ValueOf(myVar)开始,并且如果您从{{1}开始,则可以使用它}。

答案 1 :(得分:0)

要检查接口是否属于特定类型,可以使用带有两个返回值的类型断言,第二个返回值是一个布尔值,指示变量是否为指定类型。与单个返回值不同,如果变量类型错误,则不会发生混乱。

     $.ajax({
            url: '/updateCases',            
            data: {expireDate: expireDate, newStatus: newStatus },                
            type: 'POST',                
            success: function (data) {
                alert("success!!");
            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                alert(errorThrown);
            }
        });

如果您需要检查更多类型,那么使用类型开关是一个好主意:

if v, ok := myVar.(int); ok {
    // type assertion succeeded and v is myVar asserted to type int
} else {
    // type assertion failed, myVar wasn't an int
}

但请注意,这些都不能解决您的问题,因为正如您所说,JSON文档中的数字始终会被解析为float64s。因此,如果switch v := myVar.(type) { case int: // v has type int case float64: // v has type float64 default: // myVar was something other than int or float64 } 是已解析的JSON编号,则它将始终具有float64类型而不是int。

为了解决这个问题,我建议你使用json.Decoder的UseNumber()方法,这会导致解码器将数字解析为Number类型,而不是float64。看看https://golang.org/pkg/encoding/json/#Number

myVar