相关疑难解决方法(0)

我可以同时写入不同的切片元素

我有一个包含要完成的工作的切片,以及在完成所有操作时将包含结果的切片.以下是我的一般过程的草图:

var results = make([]Result, len(jobs))
wg := sync.WaitGroup{}
for i, job := range jobs {
    wg.Add(1)
    go func(i int, j job) {
        defer wg.Done()
        var r Result = doWork(j)
        results[i] = r
    }(i, job)
}
wg.Wait()
// Use results
Run Code Online (Sandbox Code Playgroud)

它似乎工作,但我没有彻底测试,我不确定它是否安全.一般来说,让多个goroutine写入任何内容都不会让我感觉良好,但在这种情况下,每个goroutine都限制在切片中自己的索引,这是预先分配的.

我想替代方案是通过渠道收集结果,但由于结果顺序很重要,这似乎相当简单.以这种方式写入切片元素是否安全?

concurrency go slice goroutine

18
推荐指数
2
解决办法
1832
查看次数

如何从按特定顺序执行的N个goroutines中收集值?

下面是Stuff类型的结构.它有三个整数.A Number,它Double和它的Power.让我们假装计算给定的整数列表的双重和幂是一个昂贵的计算.

type Stuff struct {
    Number int
    Double int
    Power  int
}

func main() {
    nums := []int{2, 3, 4} // given numbers
    stuff := []Stuff{}     // struct of stuff with transformed ints

    double := make(chan int)
    power := make(chan int)

    for _, i := range nums {
        go doubleNumber(i, double)
        go powerNumber(i, power)
    }

    // How do I get the values back in the right order?

    fmt.Println(stuff)
}

func doubleNumber(i int, c chan …
Run Code Online (Sandbox Code Playgroud)

channel go goroutine

7
推荐指数
1
解决办法
747
查看次数

标签 统计

go ×2

goroutine ×2

channel ×1

concurrency ×1

slice ×1