配列
長さが型の一部
Go
var prices [3]intint が3つ並んだ入れ物です。ここで Go らしいのは、[3]int 全体で1つの型だということです。
Go
var a [3]int
var b [5]int
a = b // エラー。型が違う長さが違えば別の型です。3個入る箱と5個入る箱は、別物として扱われます。
値を入れて作る
Go
prices := [3]int{1200, 24800, 999}個数を数えるのが面倒なときは ... を使えます。
Go
prices := [...]int{1200, 24800, 999} // [3]int になる書いた数だけの長さになります。... は「数えておいて」という指示です。
読み書きと長さ
Go
prices[0] // 1200
prices[0] = 1300 // 書き換え
len(prices) // 3添字は 0 から始まります。範囲を超えると実行時に止まります。
Go
prices[3] // panic: index out of range [3] with length 3渡すとコピーされる
ここが最も重要な性質です。配列を関数に渡すと、中身がまるごとコピーされます。
Go
func reset(p [3]int) {
p[0] = 0
}
prices := [3]int{1200, 24800, 999}
reset(prices)
fmt.Println(prices[0]) // 1200 のまま。変わらない呼ばれた側が触ったのはコピーなので、元は無傷です。安全ではありますが、要素が1万個あれば1万個ぶんコピーされます。
だから配列はあまり使わない
実際の Go のコードで、配列を直接書くことはほとんどありません。
プレーンテキスト
長さを変えられない 商品が増えたら作り直し
渡すとコピーされる 大きいと重い
長さが違うと別の型 汎用の関数を書きにくい代わりに使うのが、次のレッスンでやるスライスです。
では配列は何のためにあるのか。スライスの土台です。スライスは内部で配列を指しています。この関係を知っておくと、次のレッスンの理解が早くなります。
要件
- 受け取った3つの値を
[3]intの配列に入れる forで回して合計を求める- 最大値は1件目の値から始めて更新する
3件 合計M円 最高K円の形を返す
入出力例
arraySummary(1200, 24800, 999) → "3件 合計26999円 最高24800円"
arraySummary(50000, 100, 200) → "3件 合計50300円 最高50000円"
arraySummary(1000, 1000, 1000) → "3件 合計3000円 最高1000円"
arraySummary(0, 500, 0) → "3件 合計500円 最高500円"ヒント
編集 ゆめさく編集部