select信道处理

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!")
	}
}


posted @ Jeff的技术栈 阅读 (9999+) 评论 (99) 点赞(99) 编辑 MD 收藏
编辑推荐:
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
阅读排行:
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!
回顶部
点击右上角即可分享
微信分享提示