面试题答案
一键面试设计思路
- 任务顺序控制:使用无缓冲通道作为信号量来控制任务执行顺序。无缓冲通道的特性是发送和接收操作会阻塞,直到对应的接收和发送操作准备好,这可以用来确保任务一个接一个地执行。
- 数据交互:使用有缓冲通道来进行数据的传输。有缓冲通道允许在没有接收者的情况下先发送一定数量的数据,这对于数据传输非常有用,特别是在分布式系统中不同节点间的数据传递场景。
- 整体流程:每个任务启动一个goroutine,通过无缓冲通道接收执行信号,完成任务后通过无缓冲通道发送完成信号给下一个任务。数据在任务间通过有缓冲通道传递。
核心代码片段
package main
import (
"fmt"
)
func main() {
// 无缓冲通道用于控制任务顺序
signal1 := make(chan struct{})
signal2 := make(chan struct{})
// 有缓冲通道用于数据交互
dataChan := make(chan int, 1)
// 第一个任务
go func() {
// 等待开始信号
<-signal1
fmt.Println("Task 1 is running")
data := 42
dataChan <- data
fmt.Println("Task 1 finished, data sent:", data)
signal2 <- struct{}{}
}()
// 第二个任务
go func() {
// 等待第一个任务完成信号
<-signal2
data := <-dataChan
fmt.Println("Task 2 is running, received data:", data)
fmt.Println("Task 2 finished")
}()
// 启动第一个任务
signal1 <- struct{}{}
// 防止主程序退出
select {}
}
在上述代码中:
signal1
和signal2
是无缓冲通道,用于控制任务1和任务2的执行顺序。dataChan
是有缓冲通道,用于在任务1和任务2之间传递数据。- 主函数通过向
signal1
发送信号启动任务1,任务1完成后向signal2
发送信号启动任务2,并通过dataChan
传递数据。