在Go中,可以使用通道(channel)來實現并發訪問安全的數據結構。通過在數據結構上使用互斥鎖(mutex)或讀寫鎖(RWMutex),可以確保在并發訪問時數據結構的一致性。以下是一個使用互斥鎖來實現安全并發訪問的示例:
package main
import (
"sync"
)
type SafeMap struct {
mu sync.Mutex
items map[string]string
}
func NewSafeMap() *SafeMap {
return &SafeMap{
items: make(map[string]string),
}
}
func (sm *SafeMap) Set(key, value string) {
sm.mu.Lock()
defer sm.mu.Unlock()
sm.items[key] = value
}
func (sm *SafeMap) Get(key string) (string, bool) {
sm.mu.Lock()
defer sm.mu.Unlock()
value, ok := sm.items[key]
return value, ok
}
func main() {
sm := NewSafeMap()
go func() {
sm.Set("key1", "value1")
}()
go func() {
value, ok := sm.Get("key1")
if ok {
println(value)
}
}()
// Wait for goroutines to finish
select {}
}
在這個示例中,我們定義了一個SafeMap類型,該類型包含一個互斥鎖和一個字符串鍵值對的map。通過在Set和Get方法中使用互斥鎖,我們確保在并發訪問時數據結構的一致性。在main函數中,我們啟動兩個goroutine來并發地設置和獲取數據,并通過互斥鎖保證安全性。