スライスの概要
スライスは、Go言語における動的な配列を扱うデータ構造です。スライスは固定長の配列と異なり、要素の追加や削除が可能で、サイズを動的に変更できます。スライスは配列への参照として実装されているため、配列の一部を取り扱うこともできます。
スライスの宣言と初期化
スライスの宣言と初期化の方法は以下の通りです。
package main
import "fmt"
func main() {
// 空のスライスを宣言
var s1 []int
fmt.Println(s1) // []
// リテラルでスライスを初期化
s2 := []int{1, 2, 3}
fmt.Println(s2) // [1, 2, 3]
// make関数でスライスを作成
s3 := make([]int, 5) // 長さ5のスライスを作成
fmt.Println(s3) // [0 0 0 0 0]
}
スライスの操作
スライスに対する基本的な操作を以下に示します。
package main
import "fmt"
func main() {
s := []int{1, 2, 3, 4, 5}
// 要素のアクセス
fmt.Println(s[0]) // 1
// 要素の変更
s[1] = 10
fmt.Println(s) // [1 10 3 4 5]
// スライスの一部を取得
sub := s[1:4]
fmt.Println(sub) // [10 3 4]
// スライスの追加
s = append(s, 6, 7)
fmt.Println(s) // [1 10 3 4 5 6 7]
}
スライスの内部構造
スライスは以下の3つのフィールドで構成されています。
- ポインタ: 配列の先頭要素へのポインタ。
- 長さ: スライスの要素数。
- 容量: スライスが参照する配列の最大要素数。
この構造により、スライスは効率的にメモリを管理し、動的なサイズ変更が可能です。
マップ (Maps)
マップの概要
マップは、キーと値のペアを管理するデータ構造で、他の言語でいうところのハッシュテーブルや辞書に相当します。キーを使って迅速に値を検索、追加、削除することができます。
マップの宣言と初期化
マップの宣言と初期化の方法は以下の通りです。
package main
import "fmt"
func main() {
// 空のマップを宣言
var m1 map[string]int
fmt.Println(m1) // map[]
// make関数でマップを作成
m2 := make(map[string]int)
fmt.Println(m2) // map[]
// リテラルでマップを初期化
m3 := map[string]int{
"apple": 5,
"banana": 10,
}
fmt.Println(m3) // map[apple:5 banana:10]
}
マップの操作
マップに対する基本的な操作を以下に示します。
package main
import "fmt"
func main() {
m := map[string]int{
"apple": 5,
"banana": 10,
}
// 値の取得
fmt.Println(m["apple"]) // 5
// 値の追加・更新
m["orange"] = 8
fmt.Println(m) // map[apple:5 banana:10 orange:8]
// 値の削除
delete(m, "banana")
fmt.Println(m) // map[apple:5 orange:8]
// 値の存在確認
value, exists := m["apple"]
if exists {
fmt.Println("apple exists:", value) // apple exists: 5
} else {
fmt.Println("apple does not exist")
}
}
マップの内部構造
マップはハッシュテーブルを基に実装されており、キーを迅速に見つけるためにハッシュ関数を使用します。これにより、キーの検索、追加、削除が平均的にO(1)の時間で行われます。
まとめ
- スライス: 動的な配列で、サイズの変更や部分配列の取得が可能。
- マップ: キーと値のペアを効率的に扱うデータ構造で、迅速な検索、追加、削除が可能。