第十七篇: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)
}

浙公网安备 33010602011771号