Goroutine 行为中的数据争用
提供的代码片段引入了数据争用问题,可能会导致不可预测的结果。核心问题源于 Goroutine 的性质以及范围变量传递给 Goroutine 函数的方式。
数据竞争
提供的代码使用范围循环数据切片,并且对于每次迭代,它都会启动一个新的 goroutine 来打印字段结构的名称字段。然而,在每次迭代中,范围变量 v 指向数据切片中相同的底层数据结构,这是一个引用。
随着循环的进行以及变量 v 迭代数据切片,其值将更改为指向下一个元素。这意味着,当 goroutine 的函数执行时,它具有 v 的最后一个值,即切片中的最后一个元素。
因此,goroutine 的执行将导致打印 name 字段仅最后一个元素“三”三次,而不是任何内容中预期的“一”、“二”、“三”
解决方案
要解决此问题,有多种解决方案:
创建新变量:
使用指针片段:
使用切片元素的地址:
其他方法
以上是为什么此 Goroutine 代码会产生意外结果以及如何避免数据争用?的详细内容。更多信息请关注PHP中文网其他相关文章!