在Go语言中,全局变量可以在并发编程中使用,但是需要注意正确地处理并发访问。Go语言提供了一些同步原语,如互斥锁(Mutex)、读写锁(RWMutex)和通道(Channel),以确保在并发环境下对全局变量的安全访问。
使用互斥锁(Mutex)保护全局变量:
package main
import (
"fmt"
"sync"
)
var (
counter int
mutex sync.Mutex
)
func increment() {
mutex.Lock()
counter++
mutex.Unlock()
}
func main() {
wg := sync.WaitGroup{}
for i := 0; i < 10; i++ {
wg.Add(1)
go func() {
defer wg.Done()
increment()
}()
}
wg.Wait()
fmt.Println("Counter:", counter)
}
使用读写锁(RWMutex)保护全局变量:
package main
import (
"fmt"
"sync"
)
var (
data map[string]int
rwMutex sync.RWMutex
)
func readData() int {
rwMutex.RLock()
defer rwMutex.RUnlock()
return data["key"]
}
func writeData(key string, value int) {
rwMutex.Lock()
defer rwMutex.Unlock()
data[key] = value
}
func main() {
data = make(map[string]int)
wg := sync.WaitGroup{}
for i := 0; i < 10; i++ {
wg.Add(1)
go func() {
defer wg.Done()
writeData("key", 1)
}()
}
wg.Wait()
fmt.Println("Data:", readData())
}
使用通道(Channel)传递数据:
package main
import (
"fmt"
"sync"
)
func worker(wg *sync.WaitGroup, ch chan int) {
defer wg.Done()
for i := 0; i < 10; i++ {
ch <- i
}
close(ch)
}
func main() {
var wg sync.WaitGroup
ch := make(chan int)
wg.Add(1)
go worker(&wg, ch)
counter := 0
for value := range ch {
counter += value
}
wg.Wait()
fmt.Println("Counter:", counter)
}
总之,Go语言的全局变量可以在并发编程中使用,但需要使用适当的同步原语来确保数据的一致性和安全性。