在Go語言中,處理切片并發(fā)訪問的關(guān)鍵是使用同步原語,如互斥鎖(Mutex)或讀寫鎖(RWMutex)。這樣可以確保在同一時(shí)間只有一個(gè)協(xié)程(goroutine)能夠訪問和修改切片。下面是一個(gè)使用互斥鎖處理并發(fā)訪問的示例:
package main
import (
"fmt"
"sync"
)
type SafeSlice struct {
slice []int
mu sync.Mutex
}
func (s *SafeSlice) Add(value int) {
s.mu.Lock()
defer s.mu.Unlock()
s.slice = append(s.slice, value)
}
func (s *SafeSlice) Get(index int) int {
s.mu.Lock()
defer s.mu.Unlock()
return s.slice[index]
}
func main() {
safeSlice := SafeSlice{
slice: []int{},
}
var wg sync.WaitGroup
wg.Add(3)
go func() {
defer wg.Done()
safeSlice.Add(1)
}()
go func() {
defer wg.Done()
safeSlice.Add(2)
}()
go func() {
defer wg.Done()
fmt.Println("Value at index 0:", safeSlice.Get(0))
}()
wg.Wait()
}
在這個(gè)示例中,我們創(chuàng)建了一個(gè)名為SafeSlice
的結(jié)構(gòu)體,它包含一個(gè)整數(shù)切片和一個(gè)互斥鎖。我們?yōu)?code>Add和Get
方法添加了互斥鎖,以確保在并發(fā)訪問時(shí)不會(huì)發(fā)生數(shù)據(jù)競(jìng)爭(zhēng)。
在main
函數(shù)中,我們創(chuàng)建了三個(gè)協(xié)程:一個(gè)用于向切片添加元素,另外兩個(gè)分別用于獲取切片中的元素。通過使用互斥鎖,我們可以確保在任何時(shí)候只有一個(gè)協(xié)程能夠訪問和修改切片。最后,我們使用sync.WaitGroup
等待所有協(xié)程完成。