每周一個Github項目【第二期】govaluate

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.