这是 Beta 面试指南,内容结构、题目覆盖和示例答案可能会继续调整。
实现生产者-消费者模型
🟡 中等题目描述
使用 channel 实现一个生产者-消费者模型,支持多个生产者和消费者。
参考答案
func ProducerConsumer(producers, consumers, items int) {
jobs := make(chan int, items)
results := make(chan int, items)
// 启动生产者
for i := 0; i < producers; i++ {
go func(id int) {
for j := 0; j < items/producers; j++ {
job := id*100 + j
jobs <- job
fmt.Printf("Producer %d: produced %d\n", id, job)
}
}(i)
}
// 启动消费者
for i := 0; i < consumers; i++ {
go func(id int) {
for job := range jobs {
result := job * 2
results <- result
fmt.Printf("Consumer %d: consumed %d, result %d\n", id, job, result)
}
}(i)
}
// 等待所有生产者完成
time.Sleep(time.Second)
close(jobs)
// 收集结果
for i := 0; i < items; i++ {
<-results
}
}关键点
- 缓冲 channel:解耦生产者和消费者
- 关闭 channel:通知消费者结束
- range 遍历:自动检测 channel 关闭