golang 两个go程轮流打印一个切片的实现
更新时间:2020年10月21日 10:54:47 作者:李培冠
这篇文章主要介绍了golang 两个go程轮流打印一个切片的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
问题描述:
两个 go 程轮流打印一个切片。
Golang 实现:
使用两个 channel,只用来判断
package main import ( "fmt" "sync" ) // 两个 go 程轮流打印一个切片 func main() { ch1 := make(chan bool, 1) ch2 := make(chan bool, 1) ch1 <- true nums := []int{1, 2, 3, 4, 5, 6, 7, 8, 9} var i int var wg sync.WaitGroup wg.Add(2) go func() { for ; i < len(nums) && <-ch1; i++ { fmt.Println(nums[i]) ch2 <- true } wg.Done() }() go func() { for ; <-ch2 && i < len(nums); i++ { fmt.Println(nums[i]) ch1 <- true } wg.Done() }() wg.Wait() }
注意
要理清两个子 go 程的判断条件,要注意是先判断 i 的大小还是先判断管道是否有值。
稍有不慎就会发生死锁哦。
使用两个 channel,用来传值
package main import ( "fmt" "sync" ) // 两个 go 程轮流打印一个切片 func main() { ch1 := make(chan int, 1) ch2 := make(chan int, 1) nums := []int{1, 2, 3, 4, 5, 6, 7, 8, 9} ch1 <- nums[0] i := 1 numsLen := len(nums) var wg sync.WaitGroup wg.Add(2) go func() { for ; i < numsLen; i++ { val := <-ch1 fmt.Println(val) ch2 <- i+1 } wg.Done() }() go func() { for ; i < numsLen; i++ { val := <- ch2 fmt.Println(val) ch1 <- i+1 } wg.Done() }() wg.Wait() }
到此这篇关于golang 两个go程轮流打印一个切片的实现的文章就介绍到这了,更多相关golang go程轮流打印一个切片内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Go语言kube-scheduler深度剖析开发之scheduler初始化
这篇文章主要介绍了Go语言kube-scheduler深度剖析开发之scheduler初始化实现过程示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-04-04Go web中cookie值安全securecookie库使用原理
这篇文章主要为大家介绍了Go web中cookie值安全securecookie库使用及实现原理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2022-11-11
最新评论