面试题答案
一键面试可能出现的问题
在多个goroutine同时执行引用了外部变量的闭包时,可能会出现数据竞争问题。因为多个goroutine可能同时读写这个外部变量,导致程序出现不可预测的结果。
避免方法
- 使用互斥锁(sync.Mutex):通过互斥锁来保护对共享变量的访问,确保同一时间只有一个goroutine能够访问该变量。
- 使用通道(channel):通过通道在goroutine之间传递数据,避免共享变量。
代码示例
使用互斥锁
package main
import (
"fmt"
"sync"
)
func main() {
var mu sync.Mutex
counter := 0
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go func() {
defer wg.Done()
mu.Lock()
counter++
mu.Unlock()
}()
}
wg.Wait()
fmt.Println("Final counter value:", counter)
}
使用通道
package main
import (
"fmt"
)
func main() {
counterCh := make(chan int)
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go func() {
defer wg.Done()
counterCh <- 1
}()
}
go func() {
wg.Wait()
close(counterCh)
}()
counter := 0
for val := range counterCh {
counter += val
}
fmt.Println("Final counter value:", counter)
}