面试题答案
一键面试package main
import (
"fmt"
)
// fibonacciGenerator 是一个生成斐波那契数列的生成器函数,同时支持暂停和恢复功能
func fibonacciGenerator(control chan string) <-chan int {
result := make(chan int)
go func() {
defer close(result)
a, b := 0, 1
paused := false
for {
select {
case <-control:
paused =!paused // 切换暂停状态
default:
if paused {
continue
}
select {
case result <- a:
a, b = b, a+b
case <-control:
paused =!paused // 处理在发送前收到控制信号
}
}
}
}()
return result
}
你可以使用以下方式调用这个函数:
func main() {
control := make(chan string)
fibChan := fibonacciGenerator(control)
// 模拟生成前5个斐波那契数
for i := 0; i < 5; i++ {
fmt.Println(<-fibChan)
}
// 暂停生成器
control <- "pause"
// 这里可以做一些其他事情
// 恢复生成器
control <- "resume"
// 再生成5个斐波那契数
for i := 0; i < 5; i++ {
fmt.Println(<-fibChan)
}
close(control)
}
代码说明:
fibonacciGenerator
函数:- 接收一个
control
通道,用于接收暂停和恢复的指令。 - 返回一个只读通道
result
,用于发送生成的斐波那契数。 - 使用匿名goroutine来生成斐波那契数列,在函数结束时关闭
result
通道。 - 使用
paused
变量来跟踪生成器的暂停状态。
- 接收一个
select
语句:- 外层
select
语句用于监听control
通道的指令。如果接收到指令,切换paused
状态。 - 内层
select
语句用于在非暂停状态下,向result
通道发送斐波那契数,同时也监听control
通道,以便在发送前处理可能收到的控制信号。
- 外层
main
函数:- 创建
control
通道和fibChan
生成器通道。 - 首先生成并打印前5个斐波那契数。
- 发送"pause"指令暂停生成器,然后可以执行其他任务。
- 发送"resume"指令恢复生成器,并再生成和打印5个斐波那契数。
- 最后关闭
control
通道。
- 创建