第十七篇:go协程channel练习:交叉合并数组、遍历channel

一:交叉合并数组练习

  users:="痞子胥,涅凡尘,凤白羽,方清雪"

  ages:="19,21,25,26"

  这两个字符串,从顺序上看是一一对应的,需求是:拆分字符串成数组,交叉并合并成一个新的切片

  提示:拆分字符串为数组:string.Split(users,",")

  方法1:遍历插入

  

 

 

    方法2:使用协程 channel管道

   

 

   

 

   接下来 使上面的结果交叉合并(先使一个协程阻塞,再调用另一个协程,再阻塞,调用之前的协程)

    

 

   

 

 

    上述代码执行是有问题的,当数据较多或者协程里有比较复杂的运算,就会出现结果不对的情况,因为主线程fmt.Println(ret)继续执行完,协程还未结束;

    思考:如何保证协程都运行完再执行主线程的fmt.Println(ret)?如下进行改造

  

package main

import (
	"fmt"
	"strings"
	"sync"
)

func main()  {
	users:=strings.Split("痞子胥,涅凡尘,凤白羽,方清雪",",")
	ages:=strings.Split("19,21,25,26",",")
	var wg sync.WaitGroup
	wg.Add(2)
	c1:=make(chan bool)
	c2:=make(chan bool)
	ret:=make([]string,0)
	go func() {
		for i,v:=range users{
			<-c1
			ret=append(ret,v)
			if i==len(users)-1{
				wg.Done()
			}
			c2<-true

		}

	}()
	go func() {
		for i,v:=range ages{
			<-c2
			ret=append(ret,v)
			if i==len(ages)-1{
				wg.Done()
			}
			c1<-true
		}

	}()
	c1<-true
	wg.Wait()
	fmt.Println(ret)
}

 

 

 

     

posted @ 2020-06-10 18:03  痞子胥  阅读(741)  评论(0)    收藏  举报