1 回答

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超6個(gè)贊
這個(gè)有可能。我以前建立了一個(gè)像這樣的通用比較庫。
簡單來說,比較包含 3 個(gè)部分:
比較左側(cè)的某種值。
運(yùn)算符( ,
=
,<
,>
...)。比較右側(cè)的某種值。
這 3 個(gè)部分僅包含兩種不同的類型 - value和operator。我試圖將這兩種類型抽象為它們的基本形式。
value可以是任何東西,所以我們使用空接口 -
interface{}
。運(yùn)算符是有限集的一部分,每個(gè)都有自己的規(guī)則。
type Operator int
const (
Equals Operator = 1
)
用符號評估比較=只有一個(gè)規(guī)則是有效的——兩個(gè)值應(yīng)該是相同的類型。你不能比較1和hello。之后,您只需確保值相同。
我們可以實(shí)現(xiàn)一個(gè)新的元類型來包裝評估一個(gè)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
}
現(xiàn)在我們已經(jīng)定義了我們的類型,我們需要實(shí)現(xiàn)規(guī)則和比較函數(shù)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)
}
驚人的!所以我們現(xiàn)在可以驗(yàn)證我們的兩個(gè)值是否屬于同一類型,如果是,我們可以將它們相互比較。難題的最后一塊,是將運(yùn)算符映射到其適當(dāng)?shù)囊?guī)則和評估,并具有執(zhí)行所有這些邏輯的函數(shù)。
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
}
讓我們總結(jié)一下到目前為止我們所做的:
將基本比較抽象為value和operator。
創(chuàng)建了一種方法來驗(yàn)證一對值是否對運(yùn)算符有效。
在給定兩個(gè)值的情況下,創(chuàng)建了一種評估運(yùn)算符的方法。
我希望我對您如何解決這個(gè)問題有所了解。這是一個(gè)簡單的想法,但可能需要一些樣板才能正常工作。
祝你好運(yùn)!
- 1 回答
- 0 關(guān)注
- 112 瀏覽
添加回答
舉報(bào)