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 收藏
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
回顶部
点击右上角即可分享
微信分享提示