我注意到如果我尝试在for循环中使用goroutine附加到切片,则会出现我会丢失/空白数据的情况:
destSlice := make([]myClass, 0)
var wg sync.WaitGroup
for _, myObject := range sourceSlice {
wg.Add(1)
go func(closureMyObject myClass) {
defer wg.Done()
var tmpObj myClass
tmpObj.AttributeName = closureMyObject.AttributeName
destSlice = append(destSlice, tmpObj)
}(myObject)
}
wg.Wait()
Run Code Online (Sandbox Code Playgroud)
有时,当我打印所有AttributeNames时destSlice,一些元素是空字符串(""),有时,某些元素sourceSlice不存在destSlice.
我的代码是否有数据竞争,这是否意味着append多个goroutine并发使用它不是线程安全的?