go语言

go语言全局变量能用于并发编程吗

小樊
83
2024-12-06 06:02:59
栏目: 编程语言

在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语言的全局变量可以在并发编程中使用,但需要使用适当的同步原语来确保数据的一致性和安全性。

0
看了该问题的人还看了