在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
?
答案 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.Type
和reflect.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