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传入的值(执行顺序正常)
注意了 但是我注释了
time.Sleep(100 * time.Millisecond)
也是一样的效果~~~~这个不是阻塞go func的把~~这个demo估计就是让你了解go异步编程。
go func()是起一个异步携程去做, 后面还有一个
time.Sleep(100 * time.Millisecond)
你注意没,他让线程等待了下。嗯。知道
sync.WaitGroup
的作用疑问
:go func(baton)
运行在baton<- newRuuner
之前对把,所以每次go func(baton)
中的baton
值是不会变的呀go func(baton)
中会重新定义newRunner
也就是说这个newRunner
不会因为go func(baton)
执行而改变这是一个go demo我就是没明白这个逻辑
这是啥逻辑... ?
你明白
sync.WaitGroup
的作用吗,我读了下你的代码逻辑,代码执行的步骤大概如下:当从baton中读到4时程序会退出
否则将赋值
newRunner = runner + 1
,并且在goroutine中再调用一次Runner
紧接着程序继续往下执行
baton <- newRunner
,将newRunner的值写入到baton中。由于你初始化写入到baton中的值是1,1 != 4 所以程序会继续执行下去,接下来就会从baton中读出newRunner的值。
不过我是在想不到你有啥场景会用到这种逻辑...
不好意思 现在好了 开始我使用了格式化 没效果。。
你这代码都不格式化下,让人怎么看啊...