Сопоставьте значение, используя срезы значений как случаи с оператором switch
Я знаю, что вы можете сопоставить несколько значений с помощью оператора switch, разделяя значения запятыми:
func main() {
value := 5
switch value{
case 1,2,3:
fmt.Println("matches 1,2 or 3")
case 4,5, 6:
fmt.Println("matches 4,5 or 6")
}
}
http://play.golang.org/p/D_2Zp8bW5M
Мой вопрос заключается в том, можете ли вы сопоставить несколько значений с помощью оператора switch, используя в качестве регистра (ов) срез (ы) нескольких значений? Я знаю, что это можно сделать с помощью операторов if else и функции 'Contains(slice, element)', мне просто интересно, возможно ли это.
Как то так может быть?
func main() {
value := 5
low := []int{1, 2, 3}
high := []int{4, 5, 6}
switch value {
case low:
fmt.Println("matches 1,2 or 3")
case high:
fmt.Println("matches 4,5 or 6")
}
}
3 ответа
Решение
Лучшее, что вы можете получить, вероятно, это:
package main
import "fmt"
func contains(v int, a []int) bool {
for _, i := range a {
if i == v {
return true
}
}
return false
}
func main() {
first := []int{1, 2, 3}
second := []int{4, 5, 6}
value := 5
switch {
case contains(value, first):
fmt.Println("matches first")
case contains(value, second):
fmt.Println("matches second")
}
}
Если у вас есть контроль над срезами, вы можете вместо этого просто использовать карты:
package main
func main() {
var (
value = 5
low = map[int]bool{1: true, 2: true, 3: true}
high = map[int]bool{4: true, 5: true, 6: true}
)
switch {
case low[value]:
println("matches 1,2 or 3")
case high[value]:
println("matches 4,5 or 6")
}
}
или если все числа меньше 256, вы можете использовать байты:
package main
import "bytes"
func main() {
var (
value = []byte{5}
low = []byte{1, 2, 3}
high = []byte{4, 5, 6}
)
switch {
case bytes.Contains(low, value):
println("matches 1,2 or 3")
case bytes.Contains(high, value):
println("matches 4,5 or 6")
}
}
Нет, это невозможно из-за спецификации языка. Самые простые способы:
- использование уникальных наборов (map[value]struct{}) для динамических значений
- печать значений прямо в корпусе переключателя для статического