Golang 比较数字
Golang compare numbers
我有两个 interface{}
s a
和 b
来自 JSON 解码和用户输入,比方说:
var a interface{} = ...
var b interface{} = ...
我知道它们是数字。它们可以是以下任何类型:
unit
unit8
uint16
uint32
uint64
int
int8
int16
int32
int64
float
float32
float64
我写了一些测试代码如下。事实证明,当一个变量是 int
时,它将失败并显示 int64
断言。
var a interface{} = 1
v, f := a.(int64)
fmt.Println(v, f) //0 false
v1, f1 := a.(int)
fmt.Println(v1, f1) //1 true
所以现在我的问题如下:为了比较这两个数字,我是否必须测试这 10 多种类型的所有排列才能获得这两个类型 interface{}
变量?理想情况下,我只想将它们转换为 int64
或 float64
,但如果它们是 int
或 float
,我将无法找到它们,直到用尽所有可能的类型。
如果您的输入来自 JSON 输入,那么它是 float64
,根据 doc:
To unmarshal JSON into an interface value, Unmarshal stores one of these in the interface value:
- bool, for JSON booleans
- float64, for JSON numbers
- string, for JSON strings
- []interface{}, for JSON arrays
- map[string]interface{}, for JSON objects
- nil for JSON null
如果它来自用户输入,它就是您阅读时决定的任何内容,因此获得正确的类型应该没有任何问题。
我有两个 interface{}
s a
和 b
来自 JSON 解码和用户输入,比方说:
var a interface{} = ...
var b interface{} = ...
我知道它们是数字。它们可以是以下任何类型:
unit
unit8
uint16
uint32
uint64
int
int8
int16
int32
int64
float
float32
float64
我写了一些测试代码如下。事实证明,当一个变量是 int
时,它将失败并显示 int64
断言。
var a interface{} = 1
v, f := a.(int64)
fmt.Println(v, f) //0 false
v1, f1 := a.(int)
fmt.Println(v1, f1) //1 true
所以现在我的问题如下:为了比较这两个数字,我是否必须测试这 10 多种类型的所有排列才能获得这两个类型 interface{}
变量?理想情况下,我只想将它们转换为 int64
或 float64
,但如果它们是 int
或 float
,我将无法找到它们,直到用尽所有可能的类型。
如果您的输入来自 JSON 输入,那么它是 float64
,根据 doc:
To unmarshal JSON into an interface value, Unmarshal stores one of these in the interface value:
- bool, for JSON booleans
- float64, for JSON numbers
- string, for JSON strings
- []interface{}, for JSON arrays
- map[string]interface{}, for JSON objects
- nil for JSON null
如果它来自用户输入,它就是您阅读时决定的任何内容,因此获得正确的类型应该没有任何问题。