1. 3件のとき
  2. 最高が1件目
  3. 1件のとき
  4. 同額のときは先に出たほう
コース一覧
Go入門
構造体のスライス

Go入門

変数とゼロ値、Go唯一のループであるfor、複数戻り値とエラー処理、スライスとマップ、構造体とメソッド、ゴルーチンによる並行処理、net/httpによるAPI開発まで、Goの基礎を、毎レッスン実際にコードを書き、フリマアプリのAPIをGoで作りながら学びます。

1
Hello, Go
01. Goとは15分
02. 実行してみる15分
03. packageとmain15分
04. fmtで出力する15分
05. go buildと1バイナリ15分
06. つくる: 起動バナー20分
07. 第1章クイズ10分
2
変数と型
01. varで宣言する15分
02. := の短縮宣言15分
03. ゼロ値(Goならでは)15分
04. 基本の型15分
05. 暗黙変換なし15分
06. 定数とiota15分
07. つくる: 商品データ表示20分
08. 第2章クイズ10分
3
制御構文(forしかない世界)
01. Goのif15分
02. forしかない世界15分
03. forの七変化15分
04. Goのswitch15分
05. 定番: FizzBuzz15分
06. ループで集計15分
07. つくる: 商品集計20分
08. 第3章クイズ10分
4
関数とエラー処理
01. funcで関数を作る15分
02. 複数戻り値(Goならでは)15分
03. if err != nil(Goの心臓)15分
04. エラーを作る15分
05. deferで後始末15分
06. つくる: 検証つき関数群20分
07. 第4章クイズ10分
5
スライスとマップ
01. 配列15分
02. スライス15分
03. appendで育てる15分
04. rangeで走査する15分
05. マップ15分
06. カンマokイディオム15分
07. つくる: 検索と集計20分
08. 第5章クイズ10分
6
構造体とメソッド
01. 構造体15分
02. 初期化とフィールド15分
03. メソッド15分
04. ポインタレシーバ20分
05. New関数の慣習15分
06. 構造体のスライス15分
07. つくる: Itemで再設計20分
08. 第6章クイズ10分
7
ゴルーチンと並行処理のさわり
01. ゴルーチン15分
02. チャネル20分
03. 待ち合わせ20分
04. 並行の落とし穴20分
05. つくる: 並行集計20分
06. 第7章クイズ10分
8
Web API(net/http)
01. サーバーを立てる20分
02. ハンドラ関数20分
03. JSONを返す20分
04. ルーティング20分
05. 一覧API20分
06. 詳細APIと40420分
07. 出品API20分
08. つくる: API主要部完成25分
09. 第8章クイズ10分
9
総合制作
01. 仕様互換を仕上げる25分
02. Node版と差し替える25分
03. 1バイナリでデプロイ25分
04. 自由拡張25分
05. 完成と次のステップ20分

構造体のスライス

[]Item で一覧を持つ

第5章では、商品一覧を3つの並びで持っていました。

Go

names := []string{"きのこ図鑑", "中古スマホ"} prices := []int{1200, 24800} categories := []string{"本", "家電"}

構造体のスライスにすると、1つになります。

Go

items := []Item{ {Name: "きのこ図鑑", Price: 1200, Category: "本"}, {Name: "中古スマホ", Price: 24800, Category: "家電"}, }

中の Item{...} は、型名を省略できます。[]Item と書いた時点で要素の型は決まっているからです。

添字のずれが起こりえない

3つの並びで持っていたときの危うさが消えます。

プレーンテキスト

並び3つ 長さがずれたら壊れる。どれが対応するか約束が暗黙 []Item 1件が1つのまとまり。ずれようがない

関数の引数も1つで済みます。

Go

func summary(items []Item) string // 第5章は引数4つだった

range で回す

Go

for _, item := range items { total += item.Price }

読むだけならこれで十分です。

書き換えるときの落とし穴

第5章のクイズで触れた話が、ここで実害になります。

Go

for _, item := range items { item.Price = 0 // 効かない }

range が渡してくる item はコピーです。構造体はコピーされる側なので、書き換えても元の一覧には届きません。

添字で指定すれば効きます。

Go

for i := range items { items[i].Price = 0 // 効く }

Go を書いていて最も多い詰まりどころの1つです。 値レシーバの話と根は同じで、「コピーが渡っている」ことに気づけるかどうかにかかっています。

append も同じように使える

Go

var found []Item for _, item := range items { if item.Price < 1000 { found = append(found, item) } }

第5章で名前だけを集めていたところが、商品まるごとを集める形になります。集めた後も価格やカテゴリを参照できるので、こちらのほうが素直です。

要件

  1. 2つの並びから []Item を組み立てる
  2. append を使って要素を足す
  3. N件 合計M円 最高はC の形を返す
  4. 0件のときは 該当なし を返す
  5. 最高額が同じ商品が複数ある場合は、先に出てきたほうを採用する

入出力例

listSummary(["きのこ図鑑","中古スマホ","古い辞書"], [1200,24800,999]) → "3件 合計26999円 最高は中古スマホ" listSummary(["高級品","安物"], [50000,100]) → "2件 合計50100円 最高は高級品" listSummary(["きのこ図鑑"], [1200]) → "1件 合計1200円 最高はきのこ図鑑" listSummary(["A","B"], [1000,1000]) → "2件 合計2000円 最高はA"

ヒント

組み立ての部分は初期コードに書いてあります。その後の集計を足してください

`top := items[0]` から始めます。0 から始めると最高額の商品名が取れません

同額のときに先のほうを残すには、条件を `>` にします。`>=` にすると後のほうで上書きされます

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

関連レッスン

  • つくる: Itemで再設計

    第6章の知識で検索と集計をItem対応に書き換え、データ層を構造体に統一できます。

  • 第6章クイズ

    構造体、メソッド、ポインタレシーバ、New関数についての理解を確認します。

  • ゴルーチン

    goキーワードで処理を並行に走らせ、順番が決まらない理由を説明できるようになります。

  • サーバーを立てる

    net/httpでHTTPサーバーを立て、リクエストに応答を返せるようになります。

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

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

  • スライス範囲指定で部分列を取り出す記法
  • 関数処理に名前を付けて再利用できる単位
  • 引数位置引数=順番で渡す。
main.go
学習モード
エディタを読み込んでいます

メモ

構造体のスライス

⌘S で保存