Go言語(golang)のmap

※当サイトではアフィリエイト広告を利用しています

目次

Go言語(golang)のmap

mapの使い方を説明します。Tour of Goを参考にしています。

Go言語(golang)のmapの使い方

Go言語(Golang)のmapは、キーと値のペアを格納するハッシュテーブルのようなデータ構造です。以下に、mapを使った基本的な操作と例をいくつか紹介します。

mapの宣言と初期化

// 空のmapを宣言
var myMap map[string]int

// make関数を使って初期化
myMap = make(map[string]int)

// 初期値つきで宣言と初期化
anotherMap := map[string]string{"key1": "value1", "key2": "value2"}

要素の追加と取得

myMap["one"] = 1
myMap["two"] = 2

value := myMap["one"]
fmt.Println(value) // 1

要素の削除

delete(myMap, "two")

キーの存在チェック

value, exists := myMap["two"]
if exists {
    fmt.Println(value)
} else {
    fmt.Println("キーが存在しません")
}

ループ

for key, value := range myMap {
    fmt.Println(key, value)
}

以上が基本的なmapの使用方法です。mapはデータの追加や取得が高速であり、多くの場面で有用です。ただし、注意点としてmapはスレッドセーフではないため、複数のゴルーチンから同時にアクセスする場合は注意が必要です。必要に応じて適切な同期メカニズムを使用してください。

Go言語(golang)のmapはスレッドセーフではない

“スレッドセーフ”(Thread-Safe)とは、複数のスレッドが同時に共有されるデータに対して、データの整合性や安全性を保つことを指します。複数のスレッドが同時にデータにアクセスし、変更を加える場合、それが競合状態を引き起こす可能性があります。

競合状態は、少なくとも2つのスレッドが同じデータに同時にアクセスして、そのデータを変更しようとするときに発生します。これが起こると、データの状態が予測不可能になり、プログラムが誤った結果を生み出す可能性があります。

スレッドセーフなプログラムは、適切な同期メカニズムやロックを使用して、複数のスレッドが同時にデータにアクセスして変更することなく、データの整合性を保つようにします。これにより、競合状態が回避され、プログラムの安定性が向上します。

mapはスレッドセーフではないため、複数のゴルーチンから同時にアクセスする場合、明示的に同期する必要があります。同期処理を怠ると競合状態が発生し、予測不可能な結果が生じる可能性があります。

同時にアクセスする場合は排他制御する

sync パッケージの Mutex を使用することで排他制御を実現できます。

mu.Lock() をすると、mu.UnLock() をするまでの間、他のスレッドからは更新できなくなります。

import "sync"

var myMap map[string]int
var mu sync.Mutex

// ...

mu.Lock()
myMap["key"] = 42
mu.Unlock()

Go言語(golang)のmapの注意点

初期化されていない map は使用できない

mapを使用する前に必ず初期化する必要があります。初期化されていない map に対して要素を追加しようとすると、ランタイムパニックが発生します。

// これはエラーを引き起こします
var myMap map[string]int
myMap["key"] = 42

初期化はmake関数を使って行います。

myMap := make(map[string]int)

map は参照型である

mapは参照型であるため、関数に渡す場合や別の変数に代入する場合、元の map と同じデータを指す参照が渡されます。これにより、一方での変更が他方にも影響を与える可能性があります。

originalMap := make(map[string]int)
originalMap["key"] = 42

// 新しい変数が同じデータを指す
anotherMap := originalMap

// この変更は originalMap にも反映される
anotherMap["key"] = 99

この挙動が問題になる場合は、mapのコピーを作成するか、参照型を避けるようにすることが重要です。

順序が保証されない

mapのイテレーション順序はランダムであり、挿入順序が保証されません。順序に依存する場合は、別途ソートするなどの対策が必要です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

テック企業でプレイングマネージャーをしている Jun です。プログラミングの基礎をはじめ、組織やマネジメントについてブログを書いています。ハードスキル、ソフトスキルどちらも磨きたい方を対象にしています。一緒に学んで人生を楽しくしていきましょう!

目次