Go中如何遍歷并發(fā)訪問(wèn)安全的數(shù)據(jù)結(jié)構(gòu)

go
小億
86
2024-04-03 09:57:58

在Go中,可以使用通道(channel)來(lái)實(shí)現(xiàn)并發(fā)訪問(wèn)安全的數(shù)據(jù)結(jié)構(gòu)。通過(guò)在數(shù)據(jù)結(jié)構(gòu)上使用互斥鎖(mutex)或讀寫(xiě)鎖(RWMutex),可以確保在并發(fā)訪問(wèn)時(shí)數(shù)據(jù)結(jié)構(gòu)的一致性。以下是一個(gè)使用互斥鎖來(lái)實(shí)現(xiàn)安全并發(fā)訪問(wèn)的示例:

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 {}
}

在這個(gè)示例中,我們定義了一個(gè)SafeMap類型,該類型包含一個(gè)互斥鎖和一個(gè)字符串鍵值對(duì)的map。通過(guò)在Set和Get方法中使用互斥鎖,我們確保在并發(fā)訪問(wèn)時(shí)數(shù)據(jù)結(jié)構(gòu)的一致性。在main函數(shù)中,我們啟動(dòng)兩個(gè)goroutine來(lái)并發(fā)地設(shè)置和獲取數(shù)據(jù),并通過(guò)互斥鎖保證安全性。

0