1
0

Goのmapのキーの使用方法メモ

Posted at

内容

Go言語のmapのキーの使用方法の確認

mapの特徴

mapはGo言語における非常に便利なデータ構造の一つで、他のプログラミング言語では辞書(Dictionary)、連想配列(Associative Array)、ハッシュ(Hash)などと呼ばれることがあります。mapはキーと値のペアを格納するためのコレクションです。キーは一意でなければならず、各キーは一つの値にマッピングされます。これにより、キーを使用して迅速に値を検索、挿入、または削除することができます。

mapのメリット

  • 高速な検索: mapの主なメリットは、キーに基づくデータの検索が非常に高速であることです。キーを使用して値を直接参照できるため、大量のデータの中からも迅速に特定の要素を見つけ出すことが可能です。
  • 柔軟性: 任意の型のキーと値のペアを保存できるため(ただし、キーは比較可能でなければならない)、様々な種類のデータを扱うことができます。
  • 簡単なデータ操作: mapは値の追加、更新、削除が簡単にでき、これらの操作も高速に行えます。

mapを使用する際の考慮事項

  • mapのキーは一意である必要があり、既にキーが存在する場合にそのキーに対して新たな値をセットすると、古い値は新しい値で上書きされます。
  • キーが存在しない場合、mapからの値の取得は型のゼロ値を返します(例えば、int型のゼロ値は0string型のゼロ値は空文字"")。
  • キーの存在チェック:mapから値を取得する際には、キーが実際に存在するかどうかを確認するオプションがあります。これにより、キーが存在しない場合にデフォルト値を使用する代わりに、特定の処理を行うことができます。

mapはその柔軟性と効率の良さから、多くのプログラミングシナリオで役立つデータ構造です。キーを使ってデータを管理する必要がある場合に特に有用で、検索、更新、削除の操作を簡単かつ迅速に行うことができます。

使用例

map使用の一般的な例

Go言語において、mapの特定のキーに対する値が存在するかどうかを確認する一般的な方法は、if _, ok := m[key]; ok { ... } の形式です。これは、mapからの値の取得とそのキーが存在するかどうかの確認を同時に行う「短縮形」と見なすことができます。
、キーの存在自体を確認したい場合や、キーが存在しないときに特定の処理を行いたい場合は、第二戻り値をチェックすることが重要です。

m := map[string]int{"apple": 150, "banana": 300, "lemon": 300}
if value, ok := m["orange"]; ok {
    fmt.Println(value) // キーが存在する場合のみ実行
} else {
    fmt.Println("キーが存在しません")
}

この例では、"orange"キーがmapに存在するかを確認し、存在する場合のみその値を出力します。存在しない場合は、「キーが存在しません」と出力されます。

キー、値のチェックが不要の場合

提供されたコード例では、"banana"キーの存在を確認し、存在する場合はメッセージを出力しています。

・値だけのチェック例

m := map[string]int{"apple": 150, "banana": 300, "lemon": 300}
if _, ok := m["banana"]; ok {
    fmt.Println("バナナ美味しい")
}

bananaキーがmapに存在する場合に限り、"バナナ美味しい"と出力する」ことを意味しており、とても一般的で読みやすい方法です。ここで、_(アンダースコア)は、mapから取得した値を明示的に無視するために使用されています。okはブール値で、キーが存在する場合はtrue、存在しない場合はfalseを持ちます。

・キーの存在のみのチェック例
if文の中で_(アンダースコア)を使用して、mapからの値取得時にキーの存在確認(ok)を意図的に無視する例を示します。この場合、キーが存在しない場合でも、特にエラーハンドリングや存在確認を行わないシナリオに適しています。ただし、この方法ではキーがmapに存在しない場合、値の型のゼロ値(int型であれば0string型であれば空文字""など)が返されます。

例えば、あるフルーツの価格を調べたいが、価格が存在しない(つまりキーがmapに存在しない)場合でもプログラムを継続させたい場合にこの方法が使えます。

m := map[string]int{"apple": 150, "banana": 300, "lemon": 300}

if value, _ := m["cherry"]; value > 0 {
    fmt.Println("チェリーの価格:", value)
} else {
    fmt.Println("チェリーの価格は不明です")
}

この例では、"cherry"というキーに対する値をmapから取得しようとしますが、このキーはmapに存在しません。そのため、valueint型のゼロ値である0になります。if文の条件ではvalue > 0を評価しており、この場合は偽となるため、elseブロックが実行され、「チェリーの価格は不明です」と出力されます。

このように、if文内で直接値を取得し、それを条件に使って何かしらの処理を行う場合に、キーの存在チェックをスキップすることが可能です。ただし、この方法を使用する際は、キーが存在しない場合に型のゼロ値が返されることを意識しておく必要があります。

・値だけ取得
キーの存在確認が不要で、単に値を取得したい場合は、次のように書くことができます。

m := map[string]int{"apple": 150, "banana": 300, "lemon": 300}
value := m["banana"]
fmt.Println(value) // 300 を出力

この場合、"banana"キーに対する値300valueに代入され、その後valueを出力します。キーが存在しない場合、valueは型のゼロ値(この場合はint型で0)になります。

参考記事

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0