2014-07-02 134 views
-1

如下面的代碼所示,我在interface{}上做了一些類型切換,以便執行正確的類型切換 - 我試圖將interface{}轉換爲一個float64或一個string,然後將其與一個值進行比較,但是,在float64上使用除==之外的比較運算符時,Go會在構建時抱怨它。Golang - 在接口上未定義的比較運算符轉換爲float64

的錯誤轉到吐出如下: -

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) 
     } 
    } 
} 
+1

第一:如果'val'是一個'float32',你的類型斷言'val。(float64)'將會發生混亂。第二:比較錯誤很可能來自'subvalue.Value'不是'float64',而是一些'interface {}'。只是在操場上展示一個完整的例子。 – Volker

+0

+1爲遊樂場示例。我將補充說下面的[示例](http://play.golang.org/p/32zgpCizkA)工作正常,所以問題可能是'subval.Value'是一個接口。 – Elwinar

+0

subval.Value確實是一個Interface,我的不好。如果你們中的任何一個想要提交答案,那麼我很樂意將其標記爲「已接受」。 – Ryan

回答

1

你的問題可能是subval.Valueinterface{},所以比較運算符不可用。我認爲,當與接口進行平等比較時,請逐字比較底層類型,因此==不會給出錯誤。