猿问

在 Golang 中扩展常量

这是我的要求:我有 2 组常量。我想形成第三组,它只不过是上述两组的并集。我如何做到这一点?


type CompOp byte


const (

    EQUAL CompOp = iota

    NOT_EQUAL

)


type LogOp byte


const (

    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 

}


海绵宝宝撒
浏览 139回答 1
1回答

素胚勾勒不出你

CompOp并且LogOp不是相同类型的集合。它们不能以这种方式组合。如果可以,它们无论如何都会发生冲突,因为两者EQUAL和AND都是 0(因为它们是iota它们块中的第一个)。您将需要另一种设计。最常见的设计是将所有运算符组合到一个const块中,然后在必要时提供类似IsCompare()或IsLogic()区分它们的功能。查看os.IsExist()和os.IsPermission()作为模板。这是我可以实现它的一种方法。它浪费了一些最小值/最大值,但它使代码非常易于阅读和更新。const (&nbsp; &nbsp; // Comparison operators&nbsp; &nbsp; minComparison Op = iota&nbsp; &nbsp; EQUAL&nbsp; &nbsp; NOT_EQUAL&nbsp; &nbsp; maxComparison&nbsp; &nbsp; // Logic operators&nbsp; &nbsp; minLogic&nbsp; &nbsp; AND&nbsp; &nbsp; OR&nbsp; &nbsp; maxLogic)func IsComparsion(op Op) bool {&nbsp; &nbsp; return op >= minComparison && op <= maxComparison}func IsLogic(op Op) bool {&nbsp; &nbsp; return op >= minLogic && op <= maxLogic}但是你能把不同类型的操作当作类型吗?是的,你可以,也许它会更适合你。例如,考虑(游乐场):type Op interface {&nbsp; &nbsp; isOp()}type CompOp byteconst (&nbsp; &nbsp; EQUAL CompOp = iota&nbsp; &nbsp; NOT_EQUAL)func (op CompOp) isOp() {}type LogOp byteconst (&nbsp; &nbsp; AND LogOp = iota&nbsp; &nbsp; OR)func (op LogOp) isOp() {}func doOpThingBasedOnValue(op Op) {&nbsp; &nbsp; switch op {&nbsp; &nbsp; case EQUAL:&nbsp; &nbsp; &nbsp; &nbsp; println("passed equal")&nbsp; &nbsp; case AND:&nbsp; &nbsp; &nbsp; &nbsp; println("passed and")&nbsp; &nbsp; }}func doOpThingBasedOnType(op Op) {&nbsp; &nbsp; switch op.(type) {&nbsp; &nbsp; case CompOp:&nbsp; &nbsp; &nbsp; &nbsp; println("passed a comp")&nbsp; &nbsp; case LogOp:&nbsp; &nbsp; &nbsp; &nbsp; println("passed a logic")&nbsp; &nbsp; }}所以也许这更接近你的想法。请注意,即使AND和EQUAL都是“0”,但作为接口,它们是可区分的,因此我们可以根据需要打开它们。那样去很酷。
随时随地看视频慕课网APP

相关分类

Go
我要回答