概述
select信道处理
注意:有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: %dn", <-ch) } } }(ctx) defer close(ch) defer cancel() select { case <-ctx.Done(): time.Sleep(1 * time.Second) fmt.Println("main process exit!") } }
以上就是go语言编程之select信道处理示例详解的详细内容,更多关于go语言select信道处理 的资料请关注靠谱客其它相关文章!
最后
以上就是爱笑牛排为你收集整理的go语言编程之select信道处理示例详解的全部内容,希望文章能够帮你解决go语言编程之select信道处理示例详解所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复