go语言select信道处理
Jeff的技术栈 人气:0select信道处理
注意:有default就不会阻塞
package main func main() { var chan1 = make(chan int) var chan2 = make(chan int) select { case <-chan1: // 如果chan1成功读到数据,则进行该case处理语句 case chan2: // 如果chan2成功读到数据,则进行该case处理语句 default: // 如果上面都没有成功,则进行该case处理语句 } }
fibonacci数列监听
//fibonacci 1 1 2 3 5 8 package main import ( "fmt" ) //ch只写,quit只读 func fibonacci(ch chan<- int, quit <-chan bool) { x, y := 1, 1 for { //监听channel数据的流动 select { case ch <- x: x, y = y, x+y case flag := <-quit: fmt.Println("flag = ", flag) return } } } func main() { ch := make(chan int) //数字通信 quit := make(chan bool) //程序是否结束 //消费者,从channel读取内容 //新建协程 go func() { for i := 0; i < 8; i++ { num := <-ch fmt.Println(num) } //可以停止 quit <- true }() //别忘了() //生产者,产生数字,写入channel fibonacci(ch, quit) } 1 1 2 3 5 8 13 21 flag = true
select监听协程
func main() { //创建一个有缓存的channel ch := make(chan int, 0) //len(ch)缓冲区剩余数据个数, cap(ch)缓冲区大小 //新建协程 go func() { for i := 0; i < 10; i++ { ch <- i //往chan写内容 } }() ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) go func(ctx context.Context) { ticker := time.NewTicker(1 * time.Second) for _ = range ticker.C { select { case <-ctx.Done(): fmt.Println("child process interrupt...") return default: fmt.Printf("send message: %d\n", <-ch) } } }(ctx) defer close(ch) defer cancel() select { case <-ctx.Done(): time.Sleep(1 * time.Second) fmt.Println("main process exit!") } }
加载全部内容