两个协程交替打印一个数组,使数组中的数据按顺序输出
参考解析
题目来源:小米
答案:
使用两个channel,一个专门用于通信的 channel,另一个用于输出消息,使用两个协程进行打印数组,一个协程进行数组的访问,也能将此协程改为 main 函数的主协程。下面这种写法在打印完数组后不会退出!
package main
import (
"fmt"
"sync"
)
var wg sync.WaitGroup
func worker1(ch chan struct{}, data chan interface{}) {
defer wg.Done()
for {
select {
case <-ch:
tmp := <-data
//更清楚看见输出!
time.Sleep(time.Second * 1)
fmt.Printf("%v ", tmp)
ch <- struct{}{} //发送信号
default:
}
}
}
func worker2(ch chan struct{}, data chan interface{}) {
defer wg.Done()
ch <- struct{}{} // 先发送信号
for {
select {
case <-ch:
tmp := <-data
time.Sleep(time.Second * 1)
fmt.Printf("%v ", tmp)
ch <- struct{}{} //发送信号
default:
}
}
}
func main() {
done := make(chan struct{})
data := make(chan interface{})
wg.Add(1)
go func() {
defer wg.Done()
/*s1 := []int{1, 2, 3, 4, 5, 6}*/
s1 := []string{"a", "b", "c", "d", "e", "f"}
for _, v := range s1 {
data <- v
}
}()
wg.Add(2)
go worker1(done, data)
go worker2(done, data)
wg.Wait()
}