关于select的逻辑和对本课程的疑问

关于select的逻辑和对本课程的疑问

老师您好,在本小节中这个select的运行逻辑究竟是怎样的呀,为什么我的在"golang"里面打断点,然后每一个for,在select中都跑了三次呀http://img1.sycdn.imooc.com//climg/611f361f092d941818921156.jpg

当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

登陆购买课程后可参与讨论,去登陆

2回答
提问者 慕移动9586716 2021-08-24 23:44:19

老师,我的问题你还没回答完

ccmouse 2021-08-24 22:15:31

这个问题很好。同学观察的更为深入。

我们仔细看每一个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语句会先计算一遍,然后等到真正数据来的时候,才能挑选其中的一个分支。



  • 提问者 慕移动9586716 #1

    所有的case语句会先计算一遍,然后等到真正数据来的时候,才能挑选其中的一个分支。”这个挑选的过程是随机的嘛?还是?



    2021-10-05 10:20:42
  • ccmouse 回复 提问者 慕移动9586716 #2

    这个挑选是随机的。

    2021-10-06 11:58:22
  • 提问者 慕移动9586716 回复 ccmouse #3

    我的理解是:每一个case都是一个通道选择,我们需要先判断是哪一个channel可以满足发出数据,例如:case <-time.After(3*time.Second)是指3秒后从相关channel里面给出数据,三秒后这个time.After(3*time.Second)的通道就会发出数据,就满足该case下的语句块,(如果多个case满足条件,就随机选择,没有则default);是这样理解的吧?



    2021-10-06 12:49:42
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师