這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
golang環境下任意運算式的求值 // Arbitrary expression evaluation for golang
名稱 |
govaluate |
地址 |
Github |
作者 |
Knetic等 |
brief intro |
Arbitrary expression evaluation for golang |
簡要介紹 |
golang環境下任意運算式的求值 |
LICENSE |
MIT |
Stars |
245 |
govaluate提供了任意類似C語言的算術/字串運算式的求值。
為什麼你不應該直接在代碼中書寫運算式
有些時候,你並沒有辦法提前得知運算式的樣子,或者你希望運算式可設定。如果你有一堆運行在你的應用上的資料,或者你想要允許你的使用者自訂一些內容,或者你寫的是一個監控架構,可以獲得很多metrics資訊,然後進行一些公式計算,那麼這個庫就會非常有用。
如何使用
可以建立一個新的EvaluableExpression,然後調用它的”Evaluate”方法。
123 |
expression, err := govaluate.NewEvaluableExpression("10 > 0");result, err := expression.Evaluate(nil);// result is now set to "true", the bool value. |
那麼,如何使用參數?
1234567 |
expression, err := govaluate.NewEvaluableExpression("foo > 0");parameters := make(map[string]interface{}, 8)parameters["foo"] = -1;result, err := expression.Evaluate(parameters);// result is now set to "false", the bool value. |
這很棒,但是這些基本上可以使用代碼直接實現。那麼如果計算中牽扯到一些數學計算呢?
12345678 |
expression, err := govaluate.NewEvaluableExpression("(requests_made * requests_succeeded / 100) >= 90");parameters := make(map[string]interface{}, 8)parameters["requests_made"] = 100;parameters["requests_succeeded"] = 80;result, err := expression.Evaluate(parameters);// result is now set to "false", the bool value. |
上述例子返回的都是布爾值,事實上,它是可以返回數位。
12345678 |
expression, err := govaluate.NewEvaluableExpression("(mem_used / total_mem) * 100");parameters := make(map[string]interface{}, 8)parameters["total_mem"] = 1024;parameters["mem_used"] = 512;result, err := expression.Evaluate(parameters);// result is now set to "50.0", the float64 value. |
你也可以做一些日期的轉化,只要符合RF3339,ISO8061,Unix Date,或者ruby日期格式標準即可。如果你還是不太確定,那麼可以看一下支援的日期標準。
1234 |
expression, err := govaluate.NewEvaluableExpression("'2014-01-02' > '2014-01-01 23:59:59'");result, err := expression.Evaluate(nil);// result is now set to true |
運算式只需要進行一次句法分析,就可以多次複用。
1234567 |
expression, err := govaluate.NewEvaluableExpression("response_time <= 100");parameters := make(map[string]interface{}, 8)for {parameters["response_time"] = pingSomething();result, err := expression.Evaluate(parameters)} |
關於執行順序,本庫支援正常C標準的執行順序。編寫運算式時,請確保您正確地書寫操作符,或使用括弧來明確運算式的哪些部分應先運行。
govaluate採用\或者[]來完成轉義。
支援自訂函數
支援簡單的結構體(訪問器)
運算子支援
ruleplatform的運算式引擎支援以下運算:
二元計算符 : + - / & | ^ * % >> <<
二元比較符 : > >= < <= == != =~ !~
邏輯操作符 : || &&
括弧 : ( )
數組相關 : , IN (例子1 IN (1, 2, ‘foo’),傳回值true)
一元計算符 : ! - ~
三元運算子 : ? :
空值彙總符: ??
更多內容請查看https://github.com/Knetic/govaluate