我有一个包含要完成的工作的切片,以及在完成所有操作时将包含结果的切片.以下是我的一般过程的草图:
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都限制在切片中自己的索引,这是预先分配的.
我想替代方案是通过渠道收集结果,但由于结果顺序很重要,这似乎相当简单.以这种方式写入切片元素是否安全?
我的比赛状况很奇怪。问题是它发生在尚不存在的对象内部。
这是一个演示代码:
package main
import (
//"fmt"
"time"
)
type Object1 struct {
A int
B string
C []int
D *Object2
}
type Object2 struct {
A int
}
func NewObject1() *Object1 {
return &Object1{
A: 1,
B: "abc",
C: []int{0, 1},
D: &Object2{},
}
}
func main() {
list := []*Object1{}
tempA := 0
tempB := ""
tempC := []int{}
tempD := &Object2{}
go func() {
for {
for _, object := range list {
tempA = object.A
tempB …Run Code Online (Sandbox Code Playgroud)