MST

星途 面试题库

面试题:Go语言复数运算在并发场景下的优化

假设在一个高并发的Go程序中,有大量的复数加法运算需要处理。为了提高运算效率,需要使用并发来处理这些复数加法。请设计一个合理的并发方案,并编写相应的Go代码实现。要考虑到资源竞争、性能优化等方面的问题,并且要对代码进行必要的注释说明。
19.3万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "fmt"
    "sync"
)

// Complex 定义复数结构体
type Complex struct {
    real float64
    imag float64
}

// Add 复数加法函数
func (c1 Complex) Add(c2 Complex) Complex {
    return Complex{
        real: c1.real + c2.real,
        imag: c1.imag + c2.imag,
    }
}

// ComplexAddWorker 复数加法工作函数
func ComplexAddWorker(taskChan <-chan []Complex, resultChan chan<- Complex, wg *sync.WaitGroup) {
    defer wg.Done()
    for tasks := range taskChan {
        var sum Complex
        for _, c := range tasks {
            sum = sum.Add(c)
        }
        resultChan <- sum
    }
}

func main() {
    // 模拟大量复数
    var complexNumbers []Complex
    for i := 0; i < 1000; i++ {
        complexNumbers = append(complexNumbers, Complex{real: float64(i), imag: float64(i)})
    }

    const numWorkers = 10
    const taskSize = 100
    var wg sync.WaitGroup
    taskChan := make(chan []Complex, numWorkers)
    resultChan := make(chan Complex, numWorkers)

    // 启动工作协程
    for i := 0; i < numWorkers; i++ {
        wg.Add(1)
        go ComplexAddWorker(taskChan, resultChan, &wg)
    }

    // 分发任务
    for i := 0; i < len(complexNumbers); i += taskSize {
        end := i + taskSize
        if end > len(complexNumbers) {
            end = len(complexNumbers)
        }
        taskChan <- complexNumbers[i:end]
    }
    close(taskChan)

    // 等待所有工作协程完成
    go func() {
        wg.Wait()
        close(resultChan)
    }()

    // 汇总结果
    var finalSum Complex
    for sum := range resultChan {
        finalSum = finalSum.Add(sum)
    }

    fmt.Printf("最终结果: %v\n", finalSum)
}
  1. Complex结构体:定义复数结构,包含实部和虚部。
  2. Add方法:为Complex结构体定义加法方法,用于计算两个复数的和。
  3. ComplexAddWorker函数:工作协程函数,从任务通道taskChan获取复数切片,计算其总和并将结果发送到结果通道resultChan
  4. main函数
    • 初始化复数切片:模拟大量复数。
    • 定义工作协程数量和任务大小:分别为numWorkerstaskSize
    • 创建通道和WaitGrouptaskChan用于分发任务,resultChan用于收集结果,wg用于等待所有工作协程完成。
    • 启动工作协程:创建并启动多个工作协程。
    • 分发任务:将复数切片分成多个任务发送到taskChan
    • 等待并关闭通道:等待所有工作协程完成后关闭resultChan
    • 汇总结果:从resultChan中收集所有部分结果并汇总得到最终结果。