demonkjhh
发布于

go channel问题

package main

import (
  "fmt"
  "sync"
  "time"
)


var wg sync.WaitGroup

func main() {
   baton := make(chan int)
   wg.Add(1)
   go Runner(baton)
   baton <- 1
   wg.Wait()

}


func Runner(baton chan int) {

   var newRunner int
   runner := <-baton
   fmt.Printf("Runner %d \n", runner)

   if runner != 4 {
     newRunner = runner + 1
     go Runner(baton)
   }

   time.Sleep(100 * time.Millisecond)
   if runner == 4 {
     wg.Done()
     return
   }

   baton <- newRunner

}

go Runner(baton)为什么还能取到baton <- newRunner传入的值(执行顺序正常)

浏览 (419)
点赞
收藏
9条评论
demonkjhh
demonkjhh

注意了 但是我注释了time.Sleep(100 * time.Millisecond)也是一样的效果~~~~这个不是阻塞go func的把~~

点赞
评论
大喵喵酱
大喵喵酱

这个demo估计就是让你了解go异步编程。

点赞
评论
大喵喵酱
大喵喵酱

go func()是起一个异步携程去做, 后面还有一个time.Sleep(100 * time.Millisecond) 你注意没,他让线程等待了下。

点赞
评论
demonkjhh
demonkjhh

嗯。知道sync.WaitGroup的作用
疑问:

  1. 按逻辑不应该是go func(baton)运行在baton<- newRuuner之前对把,所以每次go func(baton)中的baton值是不会变的呀
  2. 而且go func(baton)中会重新定义newRunner也就是说这个newRunner不会因为go func(baton)执行而改变
点赞
评论
demonkjhh
demonkjhh

这是一个go demo我就是没明白这个逻辑

点赞
评论
大喵喵酱
大喵喵酱

这是啥逻辑... ?

点赞
评论
喵喵酱
喵喵酱

你明白sync.WaitGroup的作用吗,我读了下你的代码逻辑,代码执行的步骤大概如下:

  1. 当从baton中读到4时程序会退出

  2. 否则将赋值newRunner = runner + 1,并且在goroutine中再调用一次Runner

  3. 紧接着程序继续往下执行 baton <- newRunner,将newRunner的值写入到baton中。

  4. 由于你初始化写入到baton中的值是1,1 != 4 所以程序会继续执行下去,接下来就会从baton中读出newRunner的值。

不过我是在想不到你有啥场景会用到这种逻辑...

点赞
评论
demonkjhh
demonkjhh

不好意思 现在好了 开始我使用了格式化 没效果。。

点赞
评论
喵喵酱
喵喵酱

你这代码都不格式化下,让人怎么看啊...

点赞
评论