面试题答案
一键面试扇入扇出模式基本概念
- 扇入(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
函数将多个输入通道的数据合并到一个输出通道,是扇入逻辑的封装,具有复用性,不同场景合并通道数据都可使用此函数。