标签: go
示例here表示sync.Once.Do保证了字符串var a的goroutine可见性。如果例如sync.Once.Do调用的函数f()初始化结构实例的多个字段,那也是如此吗?结构实例的所有字段是否对其他goroutine可见而没有任何额外的同步?
答案 0 :(得分:2)
让我们分解example:
变量a在函数setup()返回之前设置为,因为单个goroutine中的读取和写入必须表现得好像它们按程序指定的顺序执行[ 1]。
a
setup()
来自setup()的{{1}}的单个来电发生 once.Do()的任何回复[2]。
once.Do()
因此,在对once.Do()的任何调用返回之前,变量a都设置为。在建立关系之前不需要进一步同步。
该问题询问结构字段,而不是示例中的单个变量。就内存模型而言,struct字段是变量。适用于示例中变量的所有逻辑都适用于结构中的字段。