【问题标题】:Golang compare numbersGolang 比较数字
【发布时间】:2016-04-05 08:13:25
【问题描述】:

我有两个来自 JSON 解码和用户输入的 interface{}s ab,假设:

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{} 变量的类型?理想情况下,我只想将它们转换为int64float64,但如果它们是intfloat,则在用尽所有可能的类型之前我无法找到它们。

【问题讨论】:

  • 在更一般的情况下(即在 JSON 之外),您可以只创建一个类型开关 - golang.org/doc/effective_go.html#type_switch - 并且只为您“关心”的类型创建案例。让 default 案例返回错误。

标签: go types assertion


【解决方案1】:

如果您的输入来自 JSON 输入,那么它是 float64,根据 doc

为了将 JSON 解组为接口值,Unmarshal 将其中一项存储在接口值中:

  • bool,用于 JSON 布尔值
  • float64,用于 JSON 数字
  • 字符串,用于 JSON 字符串
  • []接口{},用于 JSON 数组
  • map[string]interface{},用于 JSON 对象
  • JSON null 为 nil

如果它来自用户输入,那么它就是你在阅读时决定的任何内容,所以你应该没有任何问题来获得正确的类型。

【讨论】:

  • 啊哈!谢谢。这就说得通了。我认为关键是在我的用户输入解析器逻辑中坚持int64
  • 这两个接口仍然可以来自 JSON 或用户输入,因此它们可以是 float64 或 int64。似乎 2x2 指标比较仍然是不可避免的。
  • @ElgsQianChen 如果您要将 JSON 解组为 map[string]interface{}encoding/json保证所有数字都是 float64。如果要解组为结构,则可以将字段设为所需的任何数字类型,或使用json.Number
猜你喜欢
  • 2017-10-11
  • 2016-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-26
  • 1970-01-01
相关资源
最近更新 更多