Goのマップは、キーと値のペアを格納するための基本的なデータ構造です。これらのペアを効率的に反復処理することは、多くのアプリケーションにとって重要です。この記事では、作成からトラバーサルまで、マップの使用方法に関する完全なガイドを提供し、ベストプラクティスとよくある落とし穴を強調します。
目次
マップの宣言と初期化
Goのマップは、make()
関数または複合リテラルを使用して宣言されます。make()
を使用すると、初期容量を指定でき、大規模なマップのパフォーマンスが向上します。複合リテラルは、より小さく、静的に定義されたマップにはより簡潔です。
package main
import "fmt"
func main() {
// make()の使用
myMap := make(map[string]int, 10) // 初期容量10
myMap["apple"] = 1
myMap["banana"] = 2
myMap["cherry"] = 3
// 複合リテラルの使用
anotherMap := map[string]int{
"apple": 1,
"banana": 2,
"cherry": 3,
}
fmt.Println("myMap:", myMap)
fmt.Println("anotherMap:", anotherMap)
}
マップの反復処理
Goのマップを反復処理する標準的な方法は、for...range
ループを使用することです。重要なのは、反復処理の順序は保証されておらず、実行ごとに異なる可能性があるということです。プログラムのロジックで特定の順序に依存しないでください。
package main
import "fmt"
func main() {
myMap := map[string]int{
"apple": 1,
"banana": 2,
"cherry": 3,
}
for key, value := range myMap {
fmt.Printf("Key: %s, Value: %dn", key, value)
}
}
キーと値を選択的に反復処理する
必要に応じて、キーまたは値のみを反復処理するように選択できます。不要な要素を無視するために、ブランク識別子_
を使用します。
// キーのみを反復処理する
for key := range myMap {
fmt.Println("Key:", key)
}
// 値のみを反復処理する
for _, value := range myMap {
fmt.Println("Value:", value)
}
反復処理中の順序を維持する
特定の反復順序が必要な場合は、ソートされたデータ構造を使用する必要があります。1つの方法は、キーのスライスを使用し、それをソートしてから、スライスを反復処理し、マップから対応する値にアクセスすることです。
package main
import (
"fmt"
"sort"
)
func main() {
myMap := map[string]int{
"apple": 1,
"banana": 2,
"cherry": 3,
}
keys := make([]string, 0, len(myMap))
for k := range myMap {
keys = append(keys, k)
}
sort.Strings(keys)
for _, k := range keys {
fmt.Printf("Key: %s, Value: %dn", k, myMap[k])
}
}