关于select的逻辑和对本课程的疑问
老师您好,在本小节中这个select的运行逻辑究竟是怎样的呀,为什么我的在"golang"里面打断点,然后每一个for,在select中都跑了三次呀
当i = 0时,在select里面重复了三次,然后才进入i = 1,我去网上找了关于go语言的select,但是就是打断点的时候,看到这里就蒙了
```go
package main
import (
"fmt"
"math/rand"
"time"
)
//控制时间,向channel里面发送消息
func generator() chan int{
out := make(chan int)
go func() {
i := 0
for{
time.Sleep(time.Duration( rand.Intn(1500) ) * time.Microsecond)
out <- i
i++
}
}()
return out
}
//channel接受和打印信息
func DoWork( id int, c chan int){
for {
n := <-c //接受channel的内容
fmt.Printf("id: %v, chan:%v\n", id, n)
}
}
//建立channel,启动并发
func createWorker(id int) chan<- int{
w := make(chan int)
go DoWork(id, w)
return w
}
func main() {
var c1, c2 = generator(), generator()
worker := createWorker(0)
n := 0
hasValue := false
for i := 0;i < var chanint
if select case true
case true
case false
```
这里我循环5次吧
老师能给我捋一捋这个运行过程吗?
另外,学到目前为止,总感觉这个go语言有一定难度,目前为止我们学习的golang,处于哪一个阶段了?
尤其是并发部分的代码不是那么好理解了!
还有就是对于这门go开发工程师的课程学习有什么好的建议嘛?
正在回答 回答被采纳积分+1
老师,我的问题你还没回答完
这个问题很好。同学观察的更为深入。
我们仔细看每一个case:
case n = <-c1:
hasValue = true
它在每一次for循环时,会计算所有的case语句,就是上面的第一行。这个case语句有什么好计算的呢?比如我们在这前后有一个例子case <-time.After(3*time.Second),这个time.After(3*time.Second),就是计算,它算出来的结果,不是说要等3秒,而是一个channel,3秒以后会给这个channel送值。(可以查看一下time.After的函数定义)。
那么case语句计算完毕后,将卡在channel的收发上,我们的程序进入等待。
那么这些收发,最终会命中其中的一句case语句,使其完成收发,此时我们才运行到第二行:hasValue=true。
也就是说,所有的case语句会先计算一遍,然后等到真正数据来的时候,才能挑选其中的一个分支。
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星