go channel问题

提问 Go语言channel
9 / 116
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)
  • demonkjhh 回复
    搁浅~ 2020-02-14 08:44:17

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

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

  • 搁浅~ 回复
    demonkjhh 2020-02-12 16:59:50

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

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

  • 搁浅~ 回复
    demonkjhh 2020-02-12 17:09:30

    嗯。知道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) 你注意没,他让线程等待了下。

  • demonkjhh 回复
    额斯尼达耶 2020-02-12 13:25:36

    你明白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)执行而改变

  • demonkjhh 回复
    搁浅~ 2020-02-12 13:27:52

    这是啥逻辑... 😂

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

  • 搁浅~ 回复

    这是啥逻辑... 😂

  • 额斯尼达耶 回复
    demonkjhh 2020-02-12 13:01:48

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

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

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

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

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

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

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

  • demonkjhh 回复
    额斯尼达耶 2020-02-12 12:38:07

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

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

  • 额斯尼达耶 回复

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

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