英文:
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("匹配1、2或3")
case 4, 5, 6:
fmt.Println("匹配4、5或6")
}
}
我的问题是,你能否使用包含多个值的切片作为case来匹配多个值?我知道可以通过使用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("匹配1、2或3")
case high:
fmt.Println("匹配4、5或6")
}
}
英文:
I know you can match multiple values with the switch statement by separating values with commas:
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
My question is, can you match multiple values with the switch statement by using slice(s) of multiple values as case(s)? I know It can be done by using if else statements and a 'Contains(slice, element)' function, I am just wondering if its possible.
Something like this maybe?:
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")
}
}
答案1
得分: 13
你可以得到的最好的可能是这个:
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("匹配第一个")
case contains(value, second):
fmt.Println("匹配第二个")
}
}
这是一个Go语言的代码示例,它定义了一个名为contains
的函数,用于检查一个整数是否存在于一个整数切片中。在main
函数中,它创建了两个整数切片first
和second
,然后使用switch
语句检查变量value
是否存在于这两个切片中,并打印相应的结果。
英文:
The best you can get is probably this one:
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")
}
}
答案2
得分: 2
如果你对切片有控制权,你可以使用映射(maps)代替:
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("匹配 1、2 或 3")
case high[value]:
println("匹配 4、5 或 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("匹配 1、2 或 3")
case bytes.Contains(high, value):
println("匹配 4、5 或 6")
}
}
英文:
If you have control over the slices, you could just use maps instead:
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")
}
}
or if all the numbers are under 256, you can use 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")
}
}
答案3
得分: 0
不,由于语言规范的限制,你不能这样做。
最简单的方法有两种:
- 对于动态值,可以使用唯一的集合(map[value]struct{})。
- 对于静态值,可以直接在switch case中打印值。
英文:
No, you can't do this because of the language specification.
The easiest ways are:
- using unique sets(map[value]struct{}) for dynamic values
- printing values straight in switch case for static
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论