問5 スライスを育てよ
中段 / 目安 25分
「出品一覧の実装です」
凛さんが画面を切り替えます。「空のスライスから始めて、追加・件数・番号つき一覧表示。Node版の push と length に相当する Go の書き方を見せてください」
Go で可変長の並びを扱うのがスライスです。宣言だけなら var items []string で、このときの中身は前回見たとおり nil です。
追加は append を使いますが、ここに Go でいちばん多い落とし穴があります。
Go
append(items, "レザースニーカー") // これでは増えない
items = append(items, "レザースニーカー") // 正しいappend は元のスライスを書き換えず、新しいスライスを返します。ですから戻り値を受け取り直す必要があります。JavaScript の push とは違うところです。
なぜこうなっているかというと、スライスが「配列のどこからどこまでを見ているか」という窓のような仕組みだからです。窓が足りなくなれば、より大きな置き場所へ引っ越します。引っ越した先は元とは別物なので、返してもらわないと分かりません。
件数は len(items) で取れます。一覧は range で回します。
Go
for i, name := range items {
}番号を1から振りたいときは i + 1 を使ってください。
完成条件
商品名の配列を受け取り、番号つきの一覧を組み立てて返す関数 buildList を作ってください。
空のスライスから始めて append で1件ずつ足していく形で書きます。受け取った配列をそのまま range するのではなく、いったん自分のスライスへ移してください。
返す形は次のとおりです。件数を先頭に置き、そのあとに番号つきで並べます。区切りは改行です。
プレーンテキスト
3件
1. レザースニーカー
2. 古着のデニムジャケット
3. 木製のスツール要件
- 空のスライスから始めて
appendで1件ずつ足す(戻り値を受け取り直す) - 1行目は
lenで数えた件数を3件の形で出す - 2行目からは
1.の形で1から番号を振り、改行でつなぐ
入出力例
buildList(["レザースニーカー","古着のデニムジャケット","木製のスツール"]) → "3件
1. レザースニーカー
2. 古着のデニムジャケット
3. 木製のスツール"
buildList(["レザースニーカー"]) → "1件
1. レザースニーカー"
buildList(["木製のスツール","古着のデニムジャケット"]) → "2件
1. 木製のスツール
2. 古着のデニムジャケット"ヒント
前のヒントを開くと次が開きます。開かずに解けると未開封クリアです
ヒント 2ヒント 1 を開くと読めます
ヒント 3ヒント 2 を開くと読めます
編集 ゆめさく編集部