在Golang中扩展常量

pri*_*itz 1 constants go

这是我的要求:我有两组常数.我想形成第三组,这只是上述两组的联合.我如何实现这一目标?

type CompOp byte

const (
    EQUAL CompOp = iota
    NOT_EQUAL
)

type LogOp byte

const (
    AND LogOp = iota
    OR
)
Run Code Online (Sandbox Code Playgroud)

运营商说,我想要第三套

type Op {CompOp, LogOp}
Run Code Online (Sandbox Code Playgroud)

要么

var Op = CompOp + LogOp
Run Code Online (Sandbox Code Playgroud)

但是上述两种方式都不起作用.我如何达到这个要求?

以上对我来说很重要我正在努力实现这个目标:

type logExpr struct { 
    expr Expression
    op LogOp 
}  

type compExpr struct { 
    expr Expression
    op CompOp 
} 

type filterExpr struct { 
    expr Expression
    op Op 
}
Run Code Online (Sandbox Code Playgroud)

Rob*_*ier 6

CompOp并且LogOp不是相同类型的集合.它们不能以这种方式组合.如果他们可以,他们无论如何都会发生冲突,因为两者EQUALAND都为0(因为他们是第一个iota在他们的块).你需要另一种设计.

最常见的设计是将所有运算符组合成一个const块,然后提供类似的函数IsCompare()IsLogic()在必要时区分它们.查看os.IsExist()os.IsPermission()作为模板.

这是我可以实现它的一种方式.它浪费了一些min/max值,但它使代码非常易于阅读并且易于更新.

操场

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
}
Run Code Online (Sandbox Code Playgroud)

但是你可以将不同种类的操作视为类型吗?是的,你可以,也许它对你来说会更好.例如,考虑(游乐场):

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")
    }
}
Run Code Online (Sandbox Code Playgroud)

所以也许这更接近你的想法.请注意,即使两者ANDEQUAL为"0",作为一个接口,他们是区分的,所以我们可以对他们像切换你想要的.Go很酷.