• 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()
    }
    

    李培冠博客

    欢迎访问我的个人网站:

    李培冠博客:lpgit.com

  • 相关阅读:
    poj 最长公共子序列 1458 记忆式搜索
    选择排序
    直接 插入排序
    直接插入排序
    洛谷-P3389-高斯消元
    经济中的哪些概念
    uva-622-dp
    UVA-607-DP
    转转---面试题
    Linux事件驱动IO中select vs epoll
  • 原文地址:https://www.cnblogs.com/lpgit/p/13539657.html
Copyright © 2020-2023  润新知