使用互斥锁或通道来同步并发执行的代码中的共享变量。
示例代码:
func main() { capturedVar := 0
go func() {
capturedVar++ // 在并发执行的代码中修改捕获的变量
}()
go func() {
fmt.Println(capturedVar) // 在并发执行的代码中访问捕获的变量
}()
time.Sleep(1 * time.Second)
}
在上面的示例代码中,两个 goroutine 都在并发执行,并访问捕获的变量 capturedVar。由于 capturedVar 是共享变量,而并发执行的 goroutine 可能在同一时间修改或访问它,这可能会导致 race condition 或数据竞争。
为了避免这种情况,我们可以使用互斥锁或通道来同步对 capturedVar 的访问或修改。以下是使用互斥锁的示例代码:
var mutex sync.Mutex
func main() { capturedVar := 0
go func() {
mutex.Lock() // 获取互斥锁
capturedVar++
mutex.Unlock() // 释放互斥锁
}()
go func() {
mutex.Lock() // 获取互斥锁
fmt.Println(capturedVar)
mutex.Unlock() // 释放互斥锁
}()
time.Sleep(1 * time.Second)
}
在上面的示例代码中,我们使用了 sync 包中提供的互斥锁来保护 capturedVar 的访问和修改。通过在 goroutine 中获取锁和释放锁,我们确保同一时间只有一个 goroutine 可以访问或修改 capturedVar。
除了互斥锁,我们还可以使用通道来同步并发执行的代码中的共享变量。以下是使用通道的示例代码:
func main() { capturedVar :=