这是我的要求:我有两组常数.我想形成第三组,这只是上述两组的联合.我如何实现这一目标?
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)
CompOp并且LogOp不是相同类型的集合.它们不能以这种方式组合.如果他们可以,他们无论如何都会发生冲突,因为两者EQUAL并AND都为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)
所以也许这更接近你的想法.请注意,即使两者AND并EQUAL为"0",作为一个接口,他们是区分的,所以我们可以对他们像切换你想要的.Go很酷.