MST

星途 面试题库

面试题:Go语言函数回调在并发场景下的应用

在Go语言并发编程中,使用函数回调机制来处理多个并发任务的结果。假设有一组任务,每个任务都会返回一个结果,利用函数回调将这些结果收集并进行统一处理,要求展示如何使用goroutine和channel结合函数回调来实现这个过程,并确保程序的正确性和高效性。
10.3万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "fmt"
)

// 定义任务函数类型
type Task func() int

// 执行任务并通过回调处理结果
func executeTasks(tasks []Task, callback func([]int)) {
    resultsChan := make(chan int)
    defer close(resultsChan)

    // 启动goroutine执行每个任务
    for _, task := range tasks {
        go func(t Task) {
            result := t()
            resultsChan <- result
        }(task)
    }

    var results []int
    // 收集所有任务的结果
    for i := 0; i < len(tasks); i++ {
        result := <-resultsChan
        results = append(results, result)
    }

    // 调用回调函数处理结果
    callback(results)
}

func main() {
    tasks := []Task{
        func() int { return 10 },
        func() int { return 20 },
        func() int { return 30 },
    }

    executeTasks(tasks, func(results []int) {
        sum := 0
        for _, result := range results {
            sum += result
        }
        fmt.Println("Sum of results:", sum)
    })
}

在上述代码中:

  1. 定义任务函数类型Task 是一个函数类型,该函数无参数且返回一个 int 类型结果。
  2. executeTasks 函数
    • 创建一个 resultsChan 用于接收任务执行结果。
    • 使用 goroutine 并发执行每个任务,并将结果发送到 resultsChan 中。
    • 通过循环从 resultsChan 中收集所有任务的结果,并存储到 results 切片中。
    • 调用传入的回调函数 callback 处理收集到的结果。
  3. main 函数
    • 定义了一组任务。
    • 调用 executeTasks 函数执行任务,并传入一个回调函数,该回调函数计算所有任务结果的总和并打印。

这样就通过 goroutinechannel 结合函数回调实现了对多个并发任务结果的收集与统一处理。