基本的な概念
配列(Array) - 固定長のコレクション
- 宣言時の長さが固定され、変更不可
- 値として扱われ、代入時にコピーされる
スライス(Slice) - 可変長の配列のようなもの
- 参照型で、元の配列を指すポインタを持つ
- 動的に要素を追加可能
マップ(Map) - キーと値のペアでデータを管理
- 連想配列のような動作
- 参照型で、初期値は
nil
具体的な使用方法
配列(Array)の使用方法
// 基本的な宣言
var fruits [5]string // 長さ5のstring配列を宣言
fruits[0] = "りんご"
// 複合リテラルによる初期化
fruits := [5]string{
"りんご",
"バナナ",
"メロン",
}
// 要素数を自動的に決定する場合
fruits := [...]string{
"りんご",
"バナナ",
"メロン",
}
スライスの使用方法
// スライスの作成
fruits := []string{"りんご", "バナナ"}
// 配列からスライスを作成
array := [5]int{1, 2, 3, 4, 5}
slice := array[1:3] // インデックス1から3までをスライス
// appendで要素を追加
fruits = append(fruits, "メロン")
// make関数での作成
newSlice := make([]int, 5, 10) // 長さ5、容量10のスライス
マップの使用方法
// マップの作成
personAges := map[string]int{
"田中": 25,
"鈴木": 30,
}
// 値の取得と更新
age := personAges["田中"] // 値の取得
personAges["佐藤"] = 28 // 新しい要素の追加
// 存在しないキーへのアクセスはゼロ値が返る
unknownAge := personAges["山田"]
// make関数での作成
ages := make(map[string]int, 10) // 初期容量10のマップ
重要な注意点
配列とスライスの違い - 配列は固定長だが、スライスは可変長
- 配列は値渡しだが、スライスは参照渡し
- スライスには
len()
とcap()
という組み込み関数がある
* スライスは、その内部構造であるスライスヘッダ(ポインタ、長さ、容量)が値渡しで渡される。ただし、スライスヘッダ内のポインタが基となる配列を指し示すため、スライス経由で行われた要素の変更は元の基底配列に反映される。
マップの特徴 - キーは一意でなければならない
- 存在しないキーのアクセスはゼロ値を返す
-
delete()
関数で要素を削除可能
パフォーマンス考慮事項 - 大きな配列を関数に渡す場合はスライスとして渡すことが推奨
- マップの初期容量を適切に設定すると良い場合がある
- スライスの
append
操作は要素数が容量を超える場合、新しい配列が作られる