MST
星途 面试题库

面试题:Go中扇入扇出模式代码复用技巧之基础实现

请简述Go语言中扇入扇出模式的基本概念,并给出一个简单的示例代码,示例需体现出代码复用的基础技巧,例如将一些通用逻辑封装成函数。
31.4万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

扇入扇出模式基本概念

  • 扇入(Fan - In):指的是将多个输入通道的数据合并到一个输出通道中。它类似于将多个数据流“扇”入到一个单一的流中。通常用于从多个源收集数据并统一处理。
  • 扇出(Fan - Out):与扇入相反,是将一个输入通道的数据分发到多个输出通道。这就像将一个数据流“扇”到多个不同的流中,以便同时在多个不同的处理逻辑中使用相同的数据。

示例代码

package main

import (
    "fmt"
)

// 生成器函数,生成一系列数字发送到通道
func generator(id int, out chan<- int) {
    for i := id * 10; i < (id+1)*10; i++ {
        out <- i
    }
    close(out)
}

// 扇入函数,将多个通道的数据合并到一个通道
func fanIn(chs ...<-chan int) <-chan int {
    var wg sync.WaitGroup
    out := make(chan int)

    // 将每个输入通道的数据复制到输出通道
    output := func(ch <-chan int) {
        defer wg.Done()
        for n := range ch {
            out <- n
        }
    }
    wg.Add(len(chs))
    for _, ch := range chs {
        go output(ch)
    }

    // 所有输入通道处理完后关闭输出通道
    go func() {
        wg.Wait()
        close(out)
    }()
    return out
}

func main() {
    ch1 := make(chan int)
    ch2 := make(chan int)

    go generator(1, ch1)
    go generator(2, ch2)

    result := fanIn(ch1, ch2)

    for val := range result {
        fmt.Println(val)
    }
}

在上述代码中:

  • generator 函数是一个通用的生成器,它为每个生成器实例生成不同范围的数字并发送到指定通道,体现了代码复用,每个生成器逻辑可复用该函数。
  • fanIn 函数将多个输入通道的数据合并到一个输出通道,是扇入逻辑的封装,具有复用性,不同场景合并通道数据都可使用此函数。