面试题答案
一键面试实现思路
- 生产者:生产者向
Channel
发送数据,当数据生成完毕后,关闭Channel
。关闭Channel
是通知消费者没有更多数据的常用方式。 - 消费者:消费者从
Channel
接收数据时,使用for - range
循环来读取Channel
。for - range
循环会在Channel
关闭且所有数据都被读取完毕后自动退出,从而实现消费者的正确停止。
关键代码示例
package main
import (
"fmt"
)
func producer(out chan<- int) {
for i := 0; i < 5; i++ {
out <- i
}
close(out)
}
func consumer(in <-chan int) {
for val := range in {
fmt.Println("Consumed:", val)
}
fmt.Println("Consumer finished")
}
func main() {
ch := make(chan int)
go producer(ch)
consumer(ch)
}
在上述代码中:
producer
函数向out
这个只写Channel
发送数据,发送完成后关闭Channel
。consumer
函数通过for - range
从in
这个只读Channel
接收数据,当Channel
关闭且数据读完时,循环结束,消费者得知生产者已结束工作并停止消费。main
函数创建Channel
并启动生产者协程,然后调用消费者函数。