go channel问题

9 / 71
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传入的值(执行顺序正常)

回复(9)
  • 搁浅~ 6天前

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

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

  • demonkjhh 8天前

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

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

  • demonkjhh 8天前

    嗯。知道sync.WaitGroup的作用 疑问: 1. 按逻辑不应该是go func(baton)运行在baton<- newRuuner之前对把,所以每次go func(baton)中的baton值是不会变的呀 2. 而且go func(baton)中会重新定义newRunner也就是说这个newRunner不会因为go func(baton)执行而改变

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

  • 额斯尼达耶 8天前

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

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

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

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

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

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

    嗯。知道sync.WaitGroup的作用 疑问: 1. 按逻辑不应该是go func(baton)运行在baton<- newRuuner之前对把,所以每次go func(baton)中的baton值是不会变的呀 2. 而且go func(baton)中会重新定义newRunner也就是说这个newRunner不会因为go func(baton)执行而改变

  • 搁浅~ 8天前

    这是啥逻辑... 😂

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

  • 这是啥逻辑... 😂

  • demonkjhh 8天前

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

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

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

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

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

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

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

  • 额斯尼达耶 8天前

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

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

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

发表话题
  • 积分
    46
  • 注册排名
    3094