通过使用值的切片作为带有 switch 语句的 case 来匹配一个值
Go match a value by using slices of values as cases with switch statement
我知道您可以使用 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
我的问题是,是否可以通过使用多个值的切片作为 case(s) 来将多个值与 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")
}
}
你能得到的最好的可能是这个:
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以下,你可以使用bytes:
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{})
- 在 static
的 switch case 中直接打印值
我知道您可以使用 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
我的问题是,是否可以通过使用多个值的切片作为 case(s) 来将多个值与 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")
}
}
你能得到的最好的可能是这个:
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以下,你可以使用bytes:
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{})
- 在 static 的 switch case 中直接打印值