在Go語言中,處理切片并發訪問的關鍵是使用同步原語,如互斥鎖(Mutex)或讀寫鎖(RWMutex)。這樣可以確保在同一時間只有一個協程(goroutine)能夠訪問和修改切片。下面是一個使用互斥鎖處理并發訪問的示例:
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()
}
在這個示例中,我們創建了一個名為SafeSlice
的結構體,它包含一個整數切片和一個互斥鎖。我們為Add
和Get
方法添加了互斥鎖,以確保在并發訪問時不會發生數據競爭。
在main
函數中,我們創建了三個協程:一個用于向切片添加元素,另外兩個分別用于獲取切片中的元素。通過使用互斥鎖,我們可以確保在任何時候只有一個協程能夠訪問和修改切片。最后,我們使用sync.WaitGroup
等待所有協程完成。