亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 Golang 中擴展常量

在 Golang 中擴展常量

Go
海綿寶寶撒 2021-11-01 15:48:40
這是我的要求:我有 2 組常量。我想形成第三組,它只不過是上述兩組的并集。我如何做到這一點?type CompOp byteconst (    EQUAL CompOp = iota    NOT_EQUAL)type LogOp byteconst (    AND LogOp = iota    OR)我想要第三組,說接線員type Op {CompOp, LogOp}或者var Op = CompOp + LogOp但是以上兩種方式都不起作用。我如何達到這個要求?以上對我很重要,我正在努力實現這一目標:type logExpr struct {     expr Expression    op LogOp }  type compExpr struct {     expr Expression    op CompOp } type filterExpr struct {     expr Expression    op Op }
查看完整描述

1 回答

?
素胚勾勒不出你

TA貢獻1827條經驗 獲得超9個贊

CompOp并且LogOp不是相同類型的集合。它們不能以這種方式組合。如果可以,它們無論如何都會發生沖突,因為兩者EQUAL和AND都是 0(因為它們是iota它們塊中的第一個)。您將需要另一種設計。


最常見的設計是將所有運算符組合到一個const塊中,然后在必要時提供類似IsCompare()或IsLogic()區分它們的功能。查看os.IsExist()和os.IsPermission()作為模板。


這是我可以實現它的一種方法。它浪費了一些最小值/最大值,但它使代碼非常易于閱讀和更新。


const (

    // Comparison operators

    minComparison Op = iota

    EQUAL

    NOT_EQUAL

    maxComparison


    // Logic operators

    minLogic

    AND

    OR

    maxLogic

)


func IsComparsion(op Op) bool {

    return op >= minComparison && op <= maxComparison

}


func IsLogic(op Op) bool {

    return op >= minLogic && op <= maxLogic

}

但是你能把不同類型的操作當作類型嗎?是的,你可以,也許它會更適合你。例如,考慮(游樂場):


type Op interface {

    isOp()

}


type CompOp byte


const (

    EQUAL CompOp = iota

    NOT_EQUAL

)


func (op CompOp) isOp() {}


type LogOp byte


const (

    AND LogOp = iota

    OR

)


func (op LogOp) isOp() {}


func doOpThingBasedOnValue(op Op) {

    switch op {

    case EQUAL:

        println("passed equal")

    case AND:

        println("passed and")

    }

}


func doOpThingBasedOnType(op Op) {

    switch op.(type) {

    case CompOp:

        println("passed a comp")

    case LogOp:

        println("passed a logic")

    }

}

所以也許這更接近你的想法。請注意,即使AND和EQUAL都是“0”,但作為接口,它們是可區分的,因此我們可以根據需要打開它們。那樣去很酷。


查看完整回答
反對 回復 2021-11-01
  • 1 回答
  • 0 關注
  • 160 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號