MST

星途 面试题库

面试题:Go语言if语句逻辑判断在并发场景下的应用

在Go语言并发编程环境中,有多个goroutine同时处理数据,每个goroutine处理完数据后会返回一个结果结构体,结构体包含字段success(bool类型,表示处理是否成功)和data(interface{}类型,存储处理的数据)。编写代码,在主goroutine中使用if语句判断,当所有goroutine返回的结果中success都为true时,将所有data合并成一个切片并打印;否则,打印'有goroutine处理失败'。请考虑如何高效地处理并发数据和判断逻辑。
28.1万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "fmt"
)

// 定义结果结构体
type Result struct {
    success bool
    data    interface{}
}

func main() {
    // 模拟多个goroutine的结果
    results := []Result{
        {success: true, data: "data1"},
        {success: true, data: "data2"},
        {success: true, data: "data3"},
    }

    allSuccess := true
    var mergedData []interface{}

    for _, result := range results {
        if!result.success {
            allSuccess = false
            break
        }
        mergedData = append(mergedData, result.data)
    }

    if allSuccess {
        fmt.Println(mergedData)
    } else {
        fmt.Println("有goroutine处理失败")
    }
}

上述代码实现了对多个goroutine返回结果的判断与合并。在实际场景中,results切片的数据应是从不同goroutine实际返回获取。这里只是模拟数据。如果要从真实的goroutine获取数据,可以使用channel来接收每个goroutine返回的结果,如下示例:

package main

import (
    "fmt"
)

// 定义结果结构体
type Result struct {
    success bool
    data    interface{}
}

func worker(id int, resultChan chan<- Result) {
    // 模拟业务处理
    if id%2 == 0 {
        resultChan <- Result{success: true, data: fmt.Sprintf("worker %d data", id)}
    } else {
        resultChan <- Result{success: false, data: nil}
    }
    close(resultChan)
}

func main() {
    numWorkers := 3
    var allSuccess = true
    var mergedData []interface{}

    for i := 0; i < numWorkers; i++ {
        resultChan := make(chan Result)
        go worker(i, resultChan)
        for result := range resultChan {
            if!result.success {
                allSuccess = false
            } else {
                mergedData = append(mergedData, result.data)
            }
        }
    }

    if allSuccess {
        fmt.Println(mergedData)
    } else {
        fmt.Println("有goroutine处理失败")
    }
}

在这个改进版本中,worker函数模拟一个goroutine的工作,通过channel返回结果。main函数启动多个worker,并从channel接收结果,进行判断和合并操作。这样更符合实际的并发处理场景。