两个协程交替打印一个数组,使数组中的数据按顺序输出

本文阅读 1 分钟
首页 golang 正文
题目序号:336
题目来源:小米
频次:3470

答案:大布丁

使用两个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()
}
本文来自投稿,不代表本站立场,如若转载,请注明出处:
了解中间件吗?有什么好处?
« 上一篇 09-17
Go 高并发的特点
下一篇 » 09-17

发表评论

发表评论