Go語言切片如何處理并發(fā)訪問

小樊
82
2024-11-02 07:00:18
欄目: 編程語言

在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é)程完成。

0