1. 3件の一覧
  2. 1件だけ
  3. 2件
コース一覧
Go道場 fleamaをGoで作り直す10問
問5 スライスを育てよ

Go道場 fleamaをGoで作り直す10問

Go入門で身に付けた技を、商店街公式フリマアプリ「fleama」の Goリプレイス計画で試す演習専用コースです。解説はありません。依頼と完成条件だけを読み、白紙から自分で組み立てます。手が止まったときのために、方針・使う構文・部分解の3段階のヒントを各問に用意しています。ゼロ値の予言から始まり、error の受け止め方、for だけのループ、switch と定数、スライスとマップ、構造体とメソッド、ゴルーチンでの並行処理、JSON を返すハンドラを経て、最後は一覧・詳細・出品の3エンドポイントを Node版と互換になるよう組み上げるところまで、10問で Go の主要な道具を一巡します。1問15分から45分、全10問で約5時間です。Go入門を終えて「読めるけれど自分では書けない」と感じている方に向いています。

1
Goリプレイス計画
01. 問1 ゼロ値を予言せよ15分
02. 問2 errを無視するな20分
03. 問3 forしかない世界で集計せよ20分
04. 問4 商品状態で出し分けろ20分
05. 問5 スライスを育てよ25分
06. 問6 マップで在庫台帳25分
07. 問7 Itemに魂を込めよ30分
08. 問8 3本同時に走らせろ35分
09. 問9 JSONで応答せよ35分
10. 問10 総合 リプレイス完遂45分

問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. 木製のスツール

要件

  1. 空のスライスから始めて append で1件ずつ足す(戻り値を受け取り直す)
  2. 1行目は len で数えた件数を 3件 の形で出す
  3. 2行目からは 1. の形で1から番号を振り、改行でつなぐ

入出力例

buildList(["レザースニーカー","古着のデニムジャケット","木製のスツール"]) → "3件 1. レザースニーカー 2. 古着のデニムジャケット 3. 木製のスツール" buildList(["レザースニーカー"]) → "1件 1. レザースニーカー" buildList(["木製のスツール","古着のデニムジャケット"]) → "2件 1. 木製のスツール 2. 古着のデニムジャケット"

ヒント

前のヒントを開くと次が開きます。開かずに解けると未開封クリアです

`append` は元を書き換えません。`items = append(items, name)` の形で受け取り直します

ヒント 2ヒント 1 を開くと読めます
ヒント 3ヒント 2 を開くと読めます
生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/08/10

関連レッスン

  • 問6 マップで在庫台帳

    カンマokイディオムで、存在しないカテゴリを聞かれても事故らない台帳にします。

  • 問7 Itemに魂を込めよ

    構造体とメソッド、そして不正な商品を生ませないコンストラクタを書きます。

  • 問8 3本同時に走らせろ

    3カテゴリの集計を goroutine で同時に走らせ、チャネルで回収します。

  • 問9 JSONで応答せよ

    構造体タグで Node版と同じフィールド名の JSON を返すハンドラを書きます。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • スライス範囲指定で部分列を取り出す記法
  • 戻り値呼び出し元への返答を表す点線矢印
  • JavaScriptWeb で動的な振る舞いを担う言語
  • 配列サイズ固定の同型データの集まり
  • 関数処理に名前を付けて再利用できる単位
main.go
学習モード
エディタを読み込んでいます

メモ

問5 スライスを育てよ

⌘S で保存