为了账号安全,请及时绑定邮箱和手机立即绑定

在 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 关注
  • 138 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信