select和channel的关系
select是将channel绑在一起的粘合剂,它将channel绑在一起的时候是随机选择channel的
示例
package main
import "fmt"
func main() {
c1, c2 := make(chan interface{}), make(chan interface{})
close(c1)
close(c2)
var countC1, countC2 int64
for i := 0; i < 1000; i++ {
select {
case <-c1:
countC1++
case <-c2:
countC2++
}
}
fmt.Println(fmt.Sprintf("countC1:%d||countC2:%d", countC1, countC2))
// countC1:484||countC2:516
}
timeout模式示例
package main
import "fmt"
import "time"
func main() {
ch := make(chan interface{})
select {
case <-ch:
case <-time.After(time.Second * 2):
fmt.Println("timeout")
}
}
通知退出
package main
import "fmt"
import "time"
func main() {
done := make(chan interface{})
go func() {
time.Sleep(time.Second * 5)
close(done)
}()
loop:
for {
select {
case <-done:
fmt.Println("done...")
break loop
default:
fmt.Println("do something1...")
}
time.Sleep(time.Second)
fmt.Println("do something2...")
}
}