最近在学习go并发和同步相关的知识,关于channel尤其是单缓冲channel有很多疑问,也感谢之前很多大佬的帮助。
在晚上敲了一个关于Once的demo,代码如下
```go
package main
import (
"fmt"
"sync"
)
func main() {
doOnve()
}
func doOnve() {
var once sync.Once
funBody := func() { //被检测的是否只执行1次的函数对象
fmt.Println("Only once")
}
c := make(chan int) //无缓冲channel
for i:=0;i<10;i++{
go func() { //10个协程
once.Do(funBody)
c <- i
}()
}
for i := 0; i < 10; i++ {
fmt.Println( <- c)
}
}
```
运行结果如下![微信截图_20211027204914.png](https://static.studygolang.com/211027/7c6390e369614b94a2e0cfac25e5d2a3.png)
Once的作用体现出来了但是实在不理解为什么会打印出10个10呢(特别是我的i在循环中都没遍历到10)?有没有大佬能帮小白解释一下,感激不尽!
有疑问加站长微信联系(非本文作者)