面试题答案
一键面试在Go语言并发编程中,变量声明与初始化可能遇到以下问题:
- 竞态条件:多个goroutine同时读写共享变量,导致数据竞争,结果不可预测。
可以通过以下方式避免这些问题:
- 使用
sync.Mutex
:通过互斥锁来保护共享变量,同一时间只有一个goroutine能访问共享变量。 - 使用
sync.RWMutex
:读多写少场景下,允许并发读,写操作加锁。 - 使用
channel
:通过通道在goroutine间传递数据,避免共享变量。
以下是使用sync.Mutex
的示例代码:
package main
import (
"fmt"
"sync"
)
var (
counter int
mu sync.Mutex
)
func increment(wg *sync.WaitGroup) {
defer wg.Done()
mu.Lock()
counter++
mu.Unlock()
}
func main() {
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go increment(&wg)
}
wg.Wait()
fmt.Println("Final counter:", counter)
}
在上述代码中,counter
是共享变量,mu
是互斥锁。在increment
函数中,通过mu.Lock()
和mu.Unlock()
来保护对counter
的操作,避免竞态条件。
使用channel
的示例代码如下:
package main
import (
"fmt"
)
func main() {
ch := make(chan int)
var sum int
go func() {
for i := 1; i <= 10; i++ {
ch <- i
}
close(ch)
}()
for num := range ch {
sum += num
}
fmt.Println("Final sum:", sum)
}
在这个例子中,通过channel
传递数据,避免了共享变量的竞态问题。goroutine
向channel
发送数据,主goroutine
从channel
接收数据并计算总和。