【发布时间】: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)
}
}
}
【问题讨论】:
-
首先:如果
val是float32,你的类型断言val.(float64)将会恐慌。第二:比较错误很可能来自subvalue.Value,不是float64,而是一些interface{}。只需在操场上展示一个完整的示例。 -
+1 用于游乐场示例。我将添加以下example 工作正常,所以问题可能是
subval.Value是一个接口。 -
subval.Value 确实是一个接口,我的错。如果你们两个中的任何一个想要提交答案,那么我很乐意将其标记为已接受。
标签: go comparison switch-statement type-conversion