面试题答案
一键面试package main
import (
"fmt"
)
func main() {
tasks := []func() (int, error){
func() (int, error) { return 1, nil },
func() (int, error) { return 2, nil },
func() (int, error) { return 0, fmt.Errorf("error in task") },
}
results := make(chan struct {
result int
err error
}, len(tasks))
for _, task := range tasks {
go func(t func() (int, error)) {
res, err := t()
results <- struct {
result int
err error
}{res, err}
}(task)
}
close(results)
for res := range results {
if res.err != nil {
fmt.Printf("Task failed with error: %v\n", res.err)
} else {
fmt.Printf("Task result: %d\n", res.result)
}
}
}
解释:
- 定义一个
tasks
切片,其中每个元素是一个返回结果和错误的匿名函数。 - 创建一个
results
通道,用于接收每个任务的执行结果和可能的错误。 - 使用
goroutine
并行执行每个任务,将任务结果和错误发送到results
通道。 - 关闭
results
通道后,通过for... range
循环读取通道中的结果,处理错误并打印结果。