Go言語では、スライスやMapは非常に柔軟で強力なデータ構造です。この記事では、スライスやMapの基本的な使い方や特徴について解説します。
スライスとは
スライスは、サイズが可変の配列のようなものです。Goでは多くの場合、配列よりもスライスが使われます。
特徴
- サイズが可変:
- スライスは配列と異なり、サイズを固定せずに要素を追加・削除できます。
- 参照型:
- スライスは基底配列(Underlying Array)を参照します。
- スライスをコピーしても、元のデータに影響を及ぼします。
- 長さと容量:
len(slice)
はスライス内の現在の要素数を返します。cap(slice)
は基底配列の終端までの容量を返します。
基本例
package main
import "fmt"
func main() {
arr := [5]int{1, 2, 3, 4, 5} // 配列
slice := arr[1:4] // スライス
fmt.Println("slice:", slice) // 出力: [2 3 4]
fmt.Println("len(slice):", len(slice)) // 出力: 3
fmt.Println("cap(slice):", cap(slice)) // 出力: 4
}
要素の追加
スライスにはappend
を使って要素を追加します。
package main
import "fmt"
func main() {
slice := []int{1, 2, 3} // スライス
slice = append(slice, 4, 5)
fmt.Println(slice) // 出力: [1 2 3 4 5]
}
Pythonのリストとの比較
GoのスライスとPythonのリストは似た性質を持っています。
特徴 | Goのスライス | Pythonのリスト |
---|---|---|
サイズの可変性 | 可変 | 可変 |
要素の型 | 同じ型のみ(int, stringなど) | 異なる型を混在可能 |
初期化 | リテラル []int{1, 2, 3} や make | リテラル [1, 2, 3] |
操作メソッド | append , copy など | append , extend , pop など |
内部構造 | 基底配列を参照する | 内部的に動的配列を保持 |
Pythonのリストは異なる型を混在させることが可能であり、Goのスライスより柔軟ですが、Goのスライスは型安全である点が特徴です。
Mapとは
Mapは、Pythonの辞書(dict
)のような「キーと値」のペアを管理するデータ構造です。
特徴
- キーと値のペア:
- Mapはキーを使って値にアクセスします。
- キーは一意(ユニーク)でなければなりません。
- 参照型:
- Mapもスライスと同様に参照型です。
- 順序保証なし:
- Mapの要素には順序がありません。
基本例
package main
import "fmt"
func main() {
m := make(map[string]int) // キー: string, 値: int
m["apple"] = 1
m["banana"] = 2
fmt.Println(m) // 出力: map[apple:1 banana:2]
}
要素の追加と更新
- 要素を追加するには、
map[key] = value
を使います。 - 同じキーに対して値を再割り当てすると、既存の値が上書きされます。
package main
import "fmt"
func main() {
m := make(map[string]int)
m["apple"] = 1 // 要素の追加
m["apple"] = 10 // 値の更新
m["cherry"] = 3 // 新しい要素の追加
fmt.Println(m) // 出力: map[apple:10 cherry:3]
}
要素の削除
Goでは、delete
関数を使ってMapから要素を削除できます。
package main
import "fmt"
func main() {
m := map[string]int{"apple": 1, "banana": 2}
delete(m, "banana") // 要素の削除
fmt.Println(m) // 出力: map[apple:1]
}
GoのMapとPythonのdictの比較
特徴 | GoのMap | Pythonのdict |
---|---|---|
キーの型 | 任意の比較可能型(例: int, string) | 任意のハッシュ可能型 |
値の型 | 任意の型(型を固定) | 任意の型 |
初期化 | make(map[string]int) またはリテラル | リテラル { "key": value } |
順序 | 順序保証なし | 3.7以降は挿入順を保持 |
要素の追加 | map[key] = value | dict[key] = value |
要素の削除 | delete(map, key) | del dict[key] |
キーの存在確認 | value, exists := map[key] | key in dict |
操作メソッド | 手動操作が主 | 多数のビルトインメソッド(items , keys , values ) |
GoのMapは型安全性を持ちながら、Pythonのdictに似た柔軟性を提供します。ただし、Pythonのdictの方が多機能で簡潔な操作が可能です。
Mapとスライスの組み合わせ
Mapの値にスライスを持たせることで、複雑なデータ構造を扱うことができます。
例: Mapにスライスを格納
package main
import "fmt"
func main() {
m := make(map[string][]int)
m["numbers"] = []int{1, 2, 3} // スライスを追加
m["numbers"] = append(m["numbers"], 4) // スライスを更新
fmt.Println(m) // 出力: map[numbers:[1 2 3 4]]
}
まとめ
- スライス:
- 配列のような構造でサイズが可変。
append
を使って要素を追加。
- Map:
- 「キーと値」のペアを管理。
- 直接
map[key] = value
で要素を追加・更新。
- Pythonとの比較:
- スライスはPythonのリストに似ており、型安全で効率的。
- MapはPythonの辞書に似ており、キーと値のペアを動的に管理可能。
スライスやMapを理解することで、Go言語のデータ操作がより効率的に行えるようになります。具体的なコード例や応用例を試しながら、さらに理解を深めていきましょう!
コメントを残す