面试题答案
一键面试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)
})
}
在上述代码中:
- 定义任务函数类型:
Task
是一个函数类型,该函数无参数且返回一个int
类型结果。 executeTasks
函数:- 创建一个
resultsChan
用于接收任务执行结果。 - 使用
goroutine
并发执行每个任务,并将结果发送到resultsChan
中。 - 通过循环从
resultsChan
中收集所有任务的结果,并存储到results
切片中。 - 调用传入的回调函数
callback
处理收集到的结果。
- 创建一个
main
函数:- 定义了一组任务。
- 调用
executeTasks
函数执行任务,并传入一个回调函数,该回调函数计算所有任务结果的总和并打印。
这样就通过 goroutine
和 channel
结合函数回调实现了对多个并发任务结果的收集与统一处理。