您的位置  > 互联网

Go中的一个可运行的case,怎么办?

1. 语法结构

语句的语法结构与语句很相似,也有case语句和语句:

select {    case communication clause  :       statement(s);          case communication clause  :       statement(s);         default :        statement(s);}

阐明:

每个案例都必须是一次沟通

所有表达式都将被评估

所有发送的表达式都将被评估

如果有多个案例可以运行,则将随机公平地选择一个案例来执行。 其他人不会被处决。

否则:

如果有子句,则执行该语句。

如果没有的话,它将阻塞,直到某些通信可以运行; Go 不会重新计算 OR 值。

2. 示例代码

示例代码:

package mainimport (    "fmt"    "time")func main() {        ch1 := make(chan int)    ch2 := make(chan int)    go func() {        time.Sleep(2 * time.Second)        ch2 <- 200    }()    go func() {        time.Sleep(2 * time.Second)        ch1 <- 100    }()    select {    case num1 := <-ch1:        fmt.Println("ch1中取数据。。", num1)    case num2, ok := <-ch2:        if ok {            fmt.Println("ch2中取数据。。", num2)        }else{            fmt.Println("ch2通道已经关闭。。")        }    }}

运行结果:可能执行第一种情况,打印100,也可能执行第二种情况,打印200。 (多运行几次,结果会不一样)

该语句结合了time包和chan相关函数,示例代码:

package mainimport (    "fmt"    "time")func main() {    ch1 := make(chan int)    ch2 := make(chan int)    //go func() {    //  ch1 <- 100    //}()    select {    case <-ch1:        fmt.Println("case1可以执行。。")    case <-ch2:        fmt.Println("case2可以执行。。")    case <-time.After(3 * time.Second):        fmt.Println("case3执行。。timeout。。")    //default:    //  fmt.Println("执行了default。。")    }}

运行结果: