ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## **一:select解决阻塞** select语句是专为通道而设计的,所以每个case表达式中都只能包含操作通道的表达式 select 默认阻塞,只有监听的channel中有发送或者接受数据时才运行 * [ ] 设置default则不阻塞,通道内没有待接受的数据则执行default * [ ] * [ ] 如果不加default,则会有死锁风险 多个channel准备好时,会随机选一个执行 <br> <br> select语句包含的候选分支中的case表达式都会在select语句执行开始时先被求值 1. 所以time.After可以使用在select中 2. 求值的顺序是依从代码编写的顺序从上到下 3. 仅当select语句中的所有case表达式都被求值完毕后,它才会开始选择候选分支 4. 如果我们想连续或定时地操作其中的通道的话,就需要通过在for语句中嵌入select语句的方式实现 注意简单地在select语句的分支中使用break语句,只能结束当前的select语句的执行,而并不会对外层的for语句产生作用 **select{}永远阻塞** ![](https://img.kancloud.cn/b3/83/b383871e1b22a09932eaef59cfa7b487_1209x739.png) <br> **注意:** 第十一行代码我们往管道里写入了字符串和int进行拼接// 通过通道发送一个字符串 **运行结果** ``` stringchaN读取到hello0 stringchaN读取到hello1 stringchaN读取到hello2 intchaN读取到0 intchaN读取到1 stringchaN读取到hello3 intchaN读取到2 intchaN读取到3 stringchaN读取到hello4 intchaN读取到4 intchaN读取到5 intchaN读取到6 intchaN读取到7 intchaN读取到8 intchaN读取到9 都娶不到,不玩了 ``` <br> <br> **小结** * [ ] 并发是指 goroutine 运行的时候是相互独立的。 * [ ] 使用关键字 go 创建 goroutine 来运行函数。 * [ ] goroutine 在逻辑处理器上执行,而逻辑处理器具有独立的系统线程和运行队列。 * [ ] 竞争状态是指两个或者多个 goroutine 试图访问同一个资源。 * [ ] 原子函数和互斥锁提供了一种防止出现竞争状态的办法。 * [ ] 通道提供了一种在两个 goroutine 之间共享数据的简单方法。 * [ ] 无缓冲的通道保证同时交换数据,而有缓冲的通道不做这种保证。