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”,但作为接口,它们是可区分的,因此我们可以根据需要打开它们。那样去很酷。
- 1 回答
- 0 关注
- 138 浏览
添加回答
举报