多くのプログラミング言語では、マップ データ構造は非常に一般的なデータ構造であり、通常はキーと値で構成されます。ただし、プログラミング言語が異なると、マッピングの実装と動作が若干異なる場合があります。 Go では、マップはハッシュ テーブルとして実装される一般的なデータ型であり、マップと呼ばれます。
Golang 言語を初めて使用する多くの開発者は、Go のマップ データ構造がどのように実装されるか、整然としているかどうか、スレッド セーフであるかどうかについて非常に興味があると思います。 golang マップにシーケンスがあるかどうかを深く理解します。
Golang 言語では、Map はキーと値のペアのデータを格納するために使用できる非常に便利なデータ型です。 Map の実装はハッシュ テーブルに基づいており、一定時間で要素を取得または変更できるため、非常に高速かつ効率的です。
Map を使用して電子メール アドレスを保存する例を次に示します:
emailMap := map[string]string{ "john@example.com": "John", "jane@example.com": "Jane", "bob@example.com": "Bob", }
上の例では、Map オブジェクトを使用して電子メール アドレスと対応するユーザー名を保存しました。以下に示すように、キー (key) を通じて値 (value) を取得できます。
fmt.Println(emailMap["john@example.com"]) // Output: John
ご覧のとおり、対応する値 John を emailMap["john@example.com"] を通じて取得しました。
Golang では、range キーワードを使用してマップを走査できます。サンプル コードは次のとおりです:
for k, v := range emailMap { fmt.Printf("%s: %s ", k, v) }
上記のコードでは、 kはキーを表し、 v は値を表し、必要に応じてそれらを使用して、対応する操作を実行できます。
テストおよび実際の使用後、Golang マップは順序付けされていません。つまり、マップに格納されている要素の順序を保証できません。つまり、要素を特定の順序で Map に追加しても、それらが同じ順序で格納されたり、同じ順序で走査されたりするわけではありません。
これを示すために、次のサンプル コードを使用できます。
emailMap := map[string]string{ "john@example.com": "John", "jane@example.com": "Jane", "bob@example.com": "Bob", } for k, v := range emailMap { fmt.Printf("%s: %s ", k, v) }
このコードを複数回実行すると、出力要素の順序がランダムであることがわかります。
この順序付けされていない特性の理由は、Golang マップの実装がハッシュ テーブルであるためです。ハッシュ テーブルはハッシュ テーブルの拡張であり、ハッシュ関数を使用してキーを配列内の特定の位置にマップします。優れた。マップ項目がハッシュ関数を使用して配列に格納される場合、それらは順序に従って並べ替えられません。
Golang Map は無秩序ですが、順序付けられた Map が必要な場合は、いくつかのハックを通じてそれを実現できます。
マップ内のキーと値のペアを構造スライスに変換し、sort パッケージの関数を使用して構造スライスをソートし、最後に変換できます。マップに戻ります。サンプル コードは次のとおりです。
type kv struct { Key string Value string } var ss []kv for k, v := range emailMap { ss = append(ss, kv{k, v}) } sort.Slice(ss, func(i, j int) bool { return ss[i].Key > ss[j].Key }) for _, kv := range ss { fmt.Printf("%s: %s ", kv.Key, kv.Value) }
上記のコードでは、最初に、Key と Value という 2 つのフィールドを含む kv という名前の構造体を定義します。次に、ss という名前の kv スライスを定義し、マップ内のキーと値のペアをスライス内の構造体に変換しました。次に、sort.Slice 関数を呼び出してスライスを並べ替え、最後にループを使用してスライスを出力しました。値のペア。
開発者の便宜を図るため、go-owned-map や順序付きマップなど、順序付きマップを実装できるサードパーティ ライブラリが多数あります。これらのライブラリを使用すると、上記のハックを使用せずに、順序付けされたマップを簡単に実装できます。
複数の goroutine が同時に Map にアクセスすると、Map のデータが破損したり消失したりする可能性があります。したがって、Golang で Map を使用する場合は、スレッドの安全性に注意を払う必要があります。
この問題を解決するために、Golang は sync パッケージを提供します。このパッケージでは、Mutex および RWMutex タイプを使用して goroutine アクセスを制御できます。以下は、Mutex を使用して Map スレッド セーフティを実装する例です。
type SafeMap struct { mu sync.Mutex m map[string]string } func (sm *SafeMap) Get(key string) (string, bool) { sm.mu.Lock() defer sm.mu.Unlock() v, ok := sm.m[key] return v, ok } func (sm *SafeMap) Set(key, value string) { sm.mu.Lock() defer sm.mu.Unlock() sm.m[key] = value }
上記のコードでは、Mutex と Map を含む SafeMap という名前の構造体を定義します。 Get 関数は Mutex を使用してマップへのアクセスを制御します。また、Set 関数はマップをロックし、ロックを解除する前に関連する操作を実行します。
Golang のマップは非常に一般的で実用的なデータ型であり、キーと値のペアのデータを簡単に保存してアクセスできるようになります。 Golang Map は順序付けされていませんが、いくつかのトリックを使用することで順序付けされた Map を実現できます。同時に、複数のゴルーチンが Map を操作する場合、スレッド セーフに注意を払う必要があります。これは、sync パッケージの Mutex と RWMutex を使用して実現できます。
以上がGolang マップは注文されていますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。