1 回答

TA貢獻1909條經驗 獲得超7個贊
這個有可能。我以前構建過一個像這樣的通用比較庫。
簡單來說,比較包含三個部分:
某種值,位于比較的左側。
運算符(
=
,<
,>
, ...)。某種值,位于比較的右側。
這 3 個部分僅包含兩種不同的類型 - value和operator。我試圖將這兩種類型抽象為它們的基本形式。
value可以是任何東西,所以我們使用空接口 -
interface{}
。運算符是有限集的一部分,每個運算符都有自己的規則。
type Operator int const ( Equals Operator = 1 )
評估與符號的比較=
只有一條有效規則 - 兩個值應該屬于同一類型。你無法比較1
和hello
。之后,您只需確保這些值相同即可。
我們可以實現一個新的元類型來包裝評估operator
.
評估與符號的比較=只有一條有效規則 - 兩個值應該屬于同一類型。你無法比較1和hello。之后,您只需確保這些值相同即可。
我們可以實現一個新的元類型來包裝評估operator.
// Function signature for a "rule" of an operator.
type validFn func(left, right interface{}) bool
// Function signature for evaluating an operator comparison.
type evalFn func(left, right interface{}) bool
type operatorMeta struct {
valid []validFn
eval evalFn
}
現在我們已經定義了類型,我們需要實現 的規則和比較函數Equals。
func sameTypes(left, right interface{}) bool {
return reflect.TypeOf(left).Kind() == reflect.TypeOf(right).Kind()
}
func equals(left, right interface{}) bool {
return reflect.DeepEqual(left, right)
}
驚人的!因此,我們現在可以驗證兩個值是否屬于同一類型,如果是,我們可以將它們相互比較。難題的最后一部分是將運算符映射到其適當的規則和評估,并具有執行所有這些邏輯的函數。
var args = map[Operator]operatorMeta{
Equals: {
valid: []validFn{sameTypes},
eval: equals,
},
}
func compare(o Operator, left, right interface{}) (bool, error) {
opArgs, ok := args[o]
if !ok {
// You haven't implemented logic for this operator.
}
for _, validFn := range opArgs.valid {
if !validFn(left, right) {
// One of the rules were not satisfied.
}
}
return opArgs.eval(left, right), nil
}
讓我們總結一下到目前為止我們所得到的:
將基本比較抽象為值和運算符。
創建了一種方法來驗證一對值對于運算符是否有效。
創建了一種在給定兩個值的情況下評估運算符的方法。
我希望我能對您如何解決這個問題提供一些見解。這是一個簡單的想法,但需要一些樣板才能正常工作。
祝你好運!
- 1 回答
- 0 關注
- 171 瀏覽
添加回答
舉報