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 關注
- 160 瀏覽
添加回答
舉報