Сопоставьте значение, используя срезы значений как случаи с оператором 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")
   }
}

Нет, это невозможно из-за спецификации языка. Самые простые способы:

  1. использование уникальных наборов (map[value]struct{}) для динамических значений
  2. печать значений прямо в корпусе переключателя для статического
Другие вопросы по тегам