欢迎来到代码驿站!

Golang

当前位置:首页 > 脚本语言 > Golang

go语言编程之select信道处理示例详解

时间:2022-12-15 10:32:02|栏目:Golang|点击:

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: %d\n", <-ch)
			}
		}
	}(ctx)
	defer close(ch)
	defer cancel()
	select {
	case <-ctx.Done():
		time.Sleep(1 * time.Second)
		fmt.Println("main process exit!")
	}
}

上一篇:go语言实现Elasticsearches批量修改查询及发送MQ操作示例

栏    目:Golang

下一篇:没有了

本文标题:go语言编程之select信道处理示例详解

本文地址:http://www.codeinn.net/misctech/221423.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有