appendで育てる
追加は append
Go
prices := []int{1200, 24800}
prices = append(prices, 999)
// [1200, 24800, 999]注目してほしいのは、結果を代入し直していることです。
Go
append(prices, 999) // これだけでは増えない
prices = append(prices, 999) // こう書くappend は元のスライスを変えるのではなく、追加した結果を返します。受け取らないと消えます。
書き忘れると増えないので、Go は「結果を使っていない」とエラーで教えてくれます。
なぜ返す形なのか
前のレッスンで、スライスは配列を指す情報だと書きました。入れ物には最初から決まった容量があり、空きがあるうちは同じ配列に書き足します。
プレーンテキスト
容量4のうち2つ使用 → 3つ目を足す → 同じ場所に書ける空きが無くなると、より大きい配列を新しく作って引っ越します。このとき指す先が変わるので、新しい情報を返す必要があります。だから代入し直す形になっています。
引っ越しが起きても書いた側は気にしなくてよい、というのがこの仕組みの狙いです。
複数まとめて足す
Go
prices = append(prices, 999, 500, 300)スライスごと足すこともできます。
Go
more := []int{500, 300}
prices = append(prices, more...)末尾の ... は「バラして渡す」という意味です。これが無いと「スライスを1個足す」ことになり、型が合わずエラーになります。
空から育てる
条件に合うものだけ集めるとき、この形をよく使います。
Go
var cheap []int
for i := 0; i < len(prices); i++ {
if prices[i] < 1000 {
cheap = append(cheap, prices[i])
}
}var cheap []int のゼロ値は nil ですが、append は nil にも足せます。空から始めて育てるのが定石です。
第2章のゼロ値が効いている場面です。初期化を書かずに、いきなり使い始められます。
要件
- 価格が上限未満の商品を集める(上限ちょうどは含まない)
- 集めた商品名を
,でつないで返す - 1件も該当しないときは
該当なしを返す - 集めるところで
appendを使う
入出力例
cheapItems(["きのこ図鑑","中古スマホ","古い辞書"], [1200,24800,800], 1000) → "古い辞書"
cheapItems(["きのこ図鑑","中古スマホ","古い辞書"], [1200,24800,800], 2000) → "きのこ図鑑, 古い辞書"
cheapItems(["きのこ図鑑","古い辞書"], [1000,800], 1000) → "古い辞書"
cheapItems(["中古スマホ"], [24800], 1000) → "該当なし"
cheapItems(["A","B"], [100,200], 1000) → "A, B"ヒント
編集 ゆめさく編集部