ホームページ > バックエンド開発 > Golang > golangで読み取り専用マップを作成する方法

golangで読み取り専用マップを作成する方法

PHPz
リリース: 2023-04-14 14:35:19
オリジナル
655 人が閲覧しました

Golang は、いくつかのユニークな機能を備えた、厳密に型指定されたプログラミング言語です。そのうちの 1 つはマップであり、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() という関数があることがわかります。この関数を main 関数で使用して、読み取り専用の 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 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート