Go Programming

Go言語でマップの反復処理をマスターする

Spread the love

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])
	}
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です