map(連想配列)は最も便利なデータ構造の1つです。キーとバリューのペアで保存でき、キーの重複は許されません。
本記事では、プログラミング言語Goにおいてどのようにmap(連想配列)を実装しているかを学びます。
目次
map(連想配列)とは?
mapとは、キーとバリューのペアを格納する箱です。mapを使用すると高速で効率的な検索が可能です。
{
key: value
}
またmapは、キーの重複は許さないが、値の重複は可能です。
Goにおけるmapの宣言
では、Goでmapを宣言する方法を見ていきましょう。
package main
import (
"fmt"
)
func main() {
var names map[int]string // int型のキーと文字列のバリューを持つ
}
上記の例では、キーはint型であり、バリューはstring型である。
mapの初期化
mapをvalueで初期化する方法を見てみましょう。
make()関数の使用する場合
関数make()は、以下のようにマップを初期化するために使用することができます。
package main
import (
"fmt"
)
func main() {
var names = make(map[int]string)
names[0] = "Tanaka"
names[1] = "Kato"
fmt.Println(names) // map[0:Tanaka 1:Kato]
}
リテラル構文の使用する場合
mapは、マップリテラルの構文を使って初期化することができます。
以下はそれを説明する例です。先ほどと同じコードを、マップリテラルを使って初期化するように変更してみよう。
package main
import (
"fmt"
)
func main() {
var names = map[int]string {
0: "Tanaka",
1: "Kato", // 最後にカンマが必要
}
fmt.Println(names) // map[0:Tanaka 1:Kato]
}
Golangでmap(連想配列)の基本操作
mapのキーを挿入、削除、取得する方法について見てみましょう。
mapに要素を追加する
キーの追加は2つの方法で行うことができます。
初期化時にキーを挿入するか、インデックス構文を使って初期化するかです。
package main
import (
"fmt"
)
func main() {
var names = make(map[int]string)
names[0] = "Suzuki" // インデックスで挿入
names[1] = "Yoshida"
fmt.Println(names) // map[0:Suzuki 1:Yoshida]
}
mapからvalueを取得する
以下のように、インデックス表記を用いて、キーに関連するバリューをmapから取得することができます。
package main
import (
"fmt"
)
func main() {
var names = make(map[int]string)
names[0] = "Suzuki" // インデックスで挿入
names[1] = "Yoshida"
fmt.Println(names[1]) // Yoshida
}
keyが存在するかどうかを確認する
package main
import (
"fmt"
)
func main() {
var names = make(map[int]string)
names[0] = "Suzuki"
names[1] = "Yoshida"
fred, exists := names[0]
if(exists) {
fmt.Printf("%s exists", fred) // "Suzuki exists"
}
}
mapからkeyを削除する
mapからkeyを削除するには、delete関数を使用します。
どのように行われるか以下のコード例を見てみましょう。
package main
import (
"fmt"
)
func main() {
var names = make(map[int]string)
names[0] = "Suzuki" // indexed insertion
names[1] = "Yoshida"
names[2] = "Tanaka"
// delete Yoshida
delete(names, 1)
fmt.Println(names) // map[0:Suzuki 2:Tanaka]
}
mapエントリーの反復処理
rangeを使うと、mapを繰り返し処理し、keyとvalueの両方を取得することができます。
package main
import (
"fmt"
)
func main() {
var names = make(map[int]string)
names[0] = "Suzuki"
names[1] = "Yoshida"
names[2] = "Tanaka"
names[3] = "Sato"
names[4] = "Kato"
for _, name := range names {
fmt.Println(name)
}
}
上記のコードを実行すると以下のように出力されます。
Suzuki
Yoshida
Tanaka
Sato
Kato