【问题标题】:Golang - Comparison operator not defined on interface converted to float64Golang - 未在转换为 float64 的接口上定义比较运算符
【发布时间】:2014-07-02 16:39:28
【问题描述】:

如下面的代码所示,我正在对 interface{} 进行一些类型切换,以便进行正确的类型切换 - 我正在尝试将 interface{} 转换为 float64 或 @ 987654325@,然后将其与一个值进行比较,但是,当在 float64 上使用 == 以外的比较运算符时,Go 在构建时会抱怨它。

Go 吐出的错误如下:-

invalid operation: (interface {})(val.(float64)) > subval.Value (operator > not defined on interface)
invalid operation: (interface {})(val.(float64)) >= subval.Value (operator >= not defined on interface)
invalid operation: (interface {})(val.(float64)) < subval.Value (operator < not defined on interface)
invalid operation: (interface {})(val.(float64)) <= subval.Value (operator <= not defined on interface)

...这是我的代码:-

val:= s.FieldByName(subval.Metric).Interface()
switch val(type) {
case float64, float32, int:
    switch subval.Type {
    case "greater_than":
        if val.(float64) > subval.Value {
            runAction(subval.Action, Config)
        }
    case "greater_than_or_equal_to":
        if val.(float64) >= subval.Value {
            runAction(subval.Action, Config)
        }
    case "equal_to":
        if val.(float64) == subval.Value {
            runAction(subval.Action, Config)
        }
    case "less_than":
        if val.(float64) < subval.Value {
            runAction(subval.Action, Config)
        }
    case "less_than_or_equal_to":
        if val.(float64) <= subval.Value {
            runAction(subval.Action, Config)
        }
    }
case string:
    if subval.Type == "equal_to" {
        if val.(string) == subval.Value {
            runAction(subval.Action, Config)
        }
    }
}

【问题讨论】:

  • 首先:如果valfloat32,你的类型断言val.(float64) 将会恐慌。第二:比较错误很可能来自subvalue.Value,不是float64,而是一些interface{}。只需在操场上展示一个完整的示例。
  • +1 用于游乐场示例。我将添加以下example 工作正常,所以问题可能是subval.Value 是一个接口。
  • subval.Value 确实是一个接口,我的错。如果你们两个中的任何一个想要提交答案,那么我很乐意将其标记为已接受。

标签: go comparison switch-statement type-conversion


【解决方案1】:

您的问题可能是subval.Valueinterface{},因此比较运算符不可用。我认为在与接口进行相等比较时,请按字节比较底层类型,因此 == 不会出错。

【讨论】:

    猜你喜欢
    • 2014-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-04
    相关资源
    最近更新 更多