>  기사  >  백엔드 개발  >  golang에서 읽기 전용 지도를 만드는 방법

golang에서 읽기 전용 지도를 만드는 방법

PHPz
PHPz원래의
2023-04-14 14:34:25595검색

Golang은 몇 가지 고유한 기능을 갖춘 강력한 형식의 프로그래밍 언어입니다. 그 중 하나는 Golang 언어의 매우 실용적인 데이터 구조인 맵입니다. 그러나 지도가 강력하기는 하지만 일부 애플리케이션 시나리오에서는 실제로 지도에서 "읽기 전용" 작업만 수행하면 됩니다. 이때 읽기 작업만 수행할 수 있는 "읽기 전용" 맵으로 만들기 위해 맵에 몇 가지 제한을 적용해야 합니다.

왜 '읽기 전용' 작업이 필요한가요?

실제로 여러 개의 고루틴이 동시에 맵을 읽고 쓰는 경우 예측할 수 없는 결과가 발생할 수 있습니다. 이 경우 지도는 안전하지 않으며 데이터 오류나 충돌이 발생할 수 있습니다. 따라서 프로그램의 안전성과 안정성을 확보하기 위해 지도를 읽기 전용으로 만들어 추가적인 변경을 방지해야 할 수도 있습니다.

읽기 전용 지도를 만드는 방법은 무엇인가요?

golang에서는 sync.Map을 사용하여 읽기 전용 지도를 만들 수 있습니다. sync.Map은 동시에 안전한 맵 구현입니다. 읽기 및 쓰기 작업은 원자적이므로 여러 고루틴이 동시에 읽고 쓸 때 스레드로부터 안전합니다. sync.Map과 일반 맵의 차이점은 키와 값 유형이 모두 인터페이스{}이므로 모든 유형의 데이터를 지원할 수 있다는 것입니다.

코드 예:

package main

import (
    "sync"
    "fmt"
)

func main() {
    readOnlyMap := readOnlyMap()
    readOnlyMap.LoadOrStore("foo", "bar")

    fmt.Println(readOnlyMap.Load("foo"))
    readOnlyMap.Delete("foo")
    fmt.Println(readOnlyMap.Load("foo"))
}

func readOnlyMap() *sync.Map {
    m := &sync.Map{}
    return m
}

위의 예에서는 *sync.Map 유형의 포인터를 반환하는 readOnlyMap()이라는 함수가 있음을 알 수 있습니다. 읽기 전용 sync.Map 객체를 얻기 위해 메인 함수에서 이 함수를 사용합니다.

Load() 함수를 사용하여 읽기 전용 맵의 값을 읽을 수 있고, Delete()를 사용하여 키-값 쌍을 삭제할 수 있습니다. 그러나 Store() 함수를 사용하여 새 키-값 쌍을 작성할 수는 없습니다.

고루틴에서 읽기 전용 지도를 어떻게 사용하나요?

go 언어의 주요 특징은 동시성을 지원한다는 것입니다. 여러 고루틴 간에 읽기 전용 맵을 공유하는 경우 동시 환경에서 안전하게 읽을 수 있는지 확인해야 합니다. 이를 위해 sync.RWMutex를 사용하여 잠글 수 있습니다. RWMutex는 go 언어의 읽기-쓰기 잠금입니다. 이를 사용하여 읽기 및 쓰기 작업을 상호 배제할 수 있습니다.

코드 예:

package main

import (
    "sync"
    "fmt"
)

func main() {
    var wg sync.WaitGroup
    readOnlyMap := readOnlyMap()
    readOnlyMap.LoadOrStore("foo", "bar")

    for i := 0; i < 100; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            readOnlyMapOperation(readOnlyMap, "foo")
        }()
    }

    wg.Wait()
}

func readOnlyMapOperation(m *sync.Map, key interface{}) interface{} {
    m.RLock()
    defer m.RUnlock()

    return m.Load(key)
}

func readOnlyMap() *sync.Map {
    m := &sync.Map{}
    return m
}

위 예에서는 읽기 전용 sync.Map 개체를 사용하여 "foo" 키의 값을 읽습니다. 우리는 100개의 고루틴을 생성했고, 각 고루틴은 readOnlyMapOperation() 함수를 사용하여 sync.Map 객체의 값을 읽었습니다. sync.RWMutex 읽기-쓰기 잠금은 readOnlyMapOperation() 함수에서 사용되어 동시 조건에서 읽기 전용 작업이 스레드로부터 안전한지 확인합니다.

요약

읽기 전용 맵은 Go 언어의 매우 실용적인 데이터 구조로, 여러 고루틴이 공유 데이터를 동시에 읽을 때 안전하고 효율적인 지원을 제공할 수 있습니다. 실제 애플리케이션에서는 코드의 RWMutex 읽기-쓰기 잠금 메커니즘을 이해하고 최적의 성능과 보안을 달성하기 위해 필요에 따라 맵에 올바른 제한을 적용해야 합니다.

위 내용은 golang에서 읽기 전용 지도를 만드는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.