select信道处理
注意:有default就不会阻塞
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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数列监听
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
//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监听协程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
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!" ) } } |
以上就是go语言编程之select信道处理示例详解的详细内容,更多关于go语言select信道处理 的资料请关注服务器之家其它相关文章!
原文链接:https://www.cnblogs.com/guyouyin123/p/13986339.html