面试题答案
一键面试实现思路
- 引入一个用于通知退出的通道(通常是
context.Context
中的Done
通道,这里也可以直接使用一个普通的chan struct{}
)。 - 在监听数据的
for
循环中,使用select
语句同时监听数据接收通道和退出通道。 - 当退出通道接收到信号时,跳出循环,结束
Goroutine
的运行,完成优雅退出。
示例代码
package main
import (
"fmt"
"time"
)
func main() {
dataCh := make(chan int)
exitCh := make(chan struct{})
go func() {
for {
select {
case data, ok := <-dataCh:
if!ok {
// 数据通道关闭,也应退出
return
}
fmt.Println("Received data:", data)
case <-exitCh:
fmt.Println("Received exit signal, exiting...")
return
}
}
}()
// 模拟发送数据
for i := 0; i < 5; i++ {
dataCh <- i
time.Sleep(time.Second)
}
// 发送退出信号
close(exitCh)
time.Sleep(time.Second)
close(dataCh)
}
在上述代码中:
- 定义了一个数据接收通道
dataCh
和一个退出通知通道exitCh
。 Goroutine
使用select
语句监听dataCh
和exitCh
。- 主函数中模拟向
dataCh
发送数据,之后向exitCh
发送退出信号并关闭dataCh
,Goroutine
接收到退出信号后优雅退出。