MST

星途 面试题库

面试题:Go生成器边界处理之高级题

编写一个Go生成器函数,它生成斐波那契数列。要求对生成器进行扩展,使其可以通过通道接收指令来暂停和恢复生成,同时要妥善处理通道关闭、生成器资源释放等边界情况,确保在各种复杂情况下程序的稳定性和正确性,请给出完整代码实现及关键部分的注释说明。
36.0万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
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)
}

代码说明:

  1. fibonacciGenerator函数
    • 接收一个control通道,用于接收暂停和恢复的指令。
    • 返回一个只读通道result,用于发送生成的斐波那契数。
    • 使用匿名goroutine来生成斐波那契数列,在函数结束时关闭result通道。
    • 使用paused变量来跟踪生成器的暂停状态。
  2. select语句
    • 外层select语句用于监听control通道的指令。如果接收到指令,切换paused状态。
    • 内层select语句用于在非暂停状态下,向result通道发送斐波那契数,同时也监听control通道,以便在发送前处理可能收到的控制信号。
  3. main函数
    • 创建control通道和fibChan生成器通道。
    • 首先生成并打印前5个斐波那契数。
    • 发送"pause"指令暂停生成器,然后可以执行其他任务。
    • 发送"resume"指令恢复生成器,并再生成和打印5个斐波那契数。
    • 最后关闭control通道。