码迷,mamicode.com
首页 > 其他好文 > 详细

go tour --select

时间:2020-07-20 15:35:38      阅读:64      评论:0      收藏:0      [点我收藏+]

标签:pre   block   ret   oom   select   随机选择   ase   使用   i++   

select语句让goroutine等待多个通信操作。

select会一直阻塞,直到其中一个case可以运行,然后执行那个case。如果有多个就绪,它就随机选择一个。

package main

import "fmt"

func fibonacci(c, quit chan int) {
	x, y := 0, 1
	for {
		select {
		case c <- x:
			x, y = y, x+y
		case <-quit:
			fmt.Println("quit")
			return
		}
	}
}

func main() {
	c := make(chan int)
	quit := make(chan int)
	go func() {
		for i := 0; i < 10; i++ {
			fmt.Println(<-c)
		}
		quit <- 0
	}()
	fibonacci(c, quit)
}

如果没有其他case准备好,则运行select中的default case
使用default case下尝试发送或接收没有阻塞:

select {
case i := <-c:
    // use i
default:
    // receiving from c would block
}
package main

import (
	"fmt"
	"time"
)

func main() {
	tick := time.Tick(100 * time.Millisecond)
	boom := time.After(500 * time.Millisecond)
	for {
		select {
		case <-tick:
			fmt.Println("tick.")
		case <-boom:
			fmt.Println("BOOM!")
			return
		default:
			fmt.Println("    .")
			time.Sleep(50 * time.Millisecond)
		}
	}
}

go tour --select

标签:pre   block   ret   oom   select   随机选择   ase   使用   i++   

原文地址:https://www.cnblogs.com/t0000/p/13344987.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!