golang面试两个协程轮流打印

发布时间:2024-07-05 00:06:21

协程(Goroutine)是Go语言的特色之一,它是轻量级的线程,可以实现并发编程。在Go语言中,编写并发程序非常方便,其中一个常见的应用场景是两个协程轮流打印。下面我将简要介绍如何使用两个协程轮流打印。

协程的创建和启动

在Go语言中,我们可以使用go关键字来创建和启动一个协程。通过go关键字,我们可以将一个函数包装成一个协程,并且在主程序中同时启动多个协程。例如,我们可以创建两个协程分别打印奇数和偶数:

func printOdd() {
    for i := 1; i <= 10; i += 2 {
        fmt.Println("Odd:", i)
    }
}

func printEven() {
    for i := 2; i <= 10; i += 2 {
        fmt.Println("Even:", i)
    }
}

func main() {
    go printOdd()
    go printEven()
    time.Sleep(time.Second) // 等待协程执行完毕
}

在上述代码中,我们使用go关键字分别将printOdd和printEven函数包装成两个协程,并且在主程序中同时启动它们。为了防止主程序提前结束,我们使用time.Sleep()函数等待协程执行完毕。

协程的交替打印

在上面的例子中,我们并没有让两个协程轮流打印。为了实现协程的交替执行,我们可以使用channel(管道)来实现协程之间的通信。Go语言中的channel提供了一种安全、同步的机制,用于协程之间的数据传递。

下面是一个使用channel实现两个协程轮流打印的例子:

func printOdd(ch chan< int) {
    for i := 1; i <= 10; i += 2 {
        fmt.Println("Odd:", i)
        ch <- i + 2
        <-ch
    }
    close(ch)
}

func printEven(ch chan< int) {
    for i := 2; i <= 10; i += 2 {
        <-ch
        fmt.Println("Even:", i)
        ch <- i + 2
    }
}

func main() {
    ch := make(chan int)
    go printOdd(ch)
    go printEven(ch)
    time.Sleep(time.Second) // 等待协程执行完毕
}

在上述代码中,我们创建了一个无缓冲的channel(ch),用于协程之间的通信。printOdd函数在打印奇数后,将下一个偶数放入channel,并且从channel接收消息以等待另一个协程执行完毕。printEven函数在打印偶数前,先从channel接收消息以等待另一个协程执行完毕,并且在打印完偶数后,将下一个奇数放入channel。

总结

通过使用协程和channel,我们可以轻松实现两个协程的轮流打印功能。协程是Go语言的特色之一,它可以充分发挥多核处理器的并行能力,提高程序执行效率。同时,使用channel可以实现协程之间的同步和通信,避免了竞态条件的发生。

以上就是使用两个协程轮流打印的简要介绍。希望对你理解协程的使用有所帮助。如果你想深入学习并发编程和协程的相关知识,建议阅读Go语言官方文档和相关书籍。

相关推荐