MST
星途 面试题库

面试题:Go中生成器如何与通道(channel)协作实现并发

请描述在Go语言里,生成器函数如何通过通道与其他并发函数进行协作,以实现数据的传递与处理,并给出一个简单示例代码。
41.5万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

在Go语言中,生成器函数通过向通道发送数据,而其他并发函数从通道接收数据,以此实现数据的传递与处理。

示例代码如下:

package main

import (
    "fmt"
)

// 生成器函数,向通道发送数据
func generator(ch chan int) {
    for i := 0; i < 5; i++ {
        ch <- i
    }
    close(ch) // 数据发送完毕,关闭通道
}

// 处理函数,从通道接收数据并处理
func processor(ch chan int) {
    for num := range ch {
        fmt.Println("Processing:", num)
    }
}

func main() {
    ch := make(chan int)

    go generator(ch)
    go processor(ch)

    // 防止主函数提前退出
    select {}
}

在上述代码中:

  1. generator 函数作为生成器,向通道 ch 发送数据,并在数据发送完毕后关闭通道。
  2. processor 函数从通道 ch 接收数据并处理。这里使用 for... range 循环来读取通道数据,直到通道关闭。
  3. main 函数中,创建了通道 ch,并分别启动 generatorprocessor 两个协程。最后使用 select {} 防止主函数提前退出。