【发布时间】:2016-04-05 08:13:25
【问题描述】:
我有两个来自 JSON 解码和用户输入的 interface{}s a 和 b,假设:
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 之外),您可以只创建一个类型开关 - golang.org/doc/effective_go.html#type_switch - 并且只为您“关心”的类型创建案例。让
default案例返回错误。