面试题答案
一键面试使用指针在Go并发编程中的潜在问题
- 数据竞争:多个goroutine同时读写指针指向的数据时,可能会导致数据竞争。例如:
package main
import (
"fmt"
)
var data *int
func modifyData() {
num := 10
data = &num
}
func readData() {
if data != nil {
fmt.Println(*data)
}
}
func main() {
go modifyData()
go readData()
// 防止程序退出,这里简单sleep,实际中可以用更合适的同步机制
select {}
}
在这个例子中,modifyData
和 readData
两个goroutine同时操作 data
指针指向的数据,可能会引发数据竞争,导致未定义行为。
使用 sync.Mutex
安全使用指针
package main
import (
"fmt"
"sync"
)
var data *int
var mu sync.Mutex
func modifyData() {
num := 10
mu.Lock()
data = &num
mu.Unlock()
}
func readData() {
mu.Lock()
if data != nil {
fmt.Println(*data)
}
mu.Unlock()
}
func main() {
go modifyData()
go readData()
// 防止程序退出,这里简单sleep,实际中可以用更合适的同步机制
select {}
}
在这个改进的代码中,通过 sync.Mutex
来锁定和解锁对 data
指针及其指向数据的操作,确保同一时间只有一个goroutine可以访问或修改指针指向的数据,从而避免数据竞争。