コース一覧
    Go基礎:データ構造
    構造体のスライス

    Go基礎:データ構造

    Goのスライス、マップ、構造体、メソッドを使ったデータ表現を学ぶコースです。

    1
    スライスとマップ
    01. 配列15分
    02. スライス15分
    03. appendで育てる15分
    04. rangeで走査する15分
    05. マップ15分
    06. カンマokイディオム15分
    07. つくる: 検索と集計20分
    08. 第5章クイズ10分
    2
    構造体とメソッド
    01. 構造体15分
    02. 初期化とフィールド15分
    03. メソッド15分
    04. ポインタレシーバ20分
    05. New関数の慣習15分
    06. 構造体のスライス15分
    07. つくる: Itemで再設計20分
    08. 第6章クイズ10分

    構造体のスライス

    []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. 最高額が同じ商品が複数ある場合は、先に出てきたほうを採用する

    ヒント

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

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

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

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

    関連レッスン

    • つくる: Itemで再設計

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

    • 第6章クイズ

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

    • New関数の慣習

      検証つきの生成関数を書き、不正な商品を作れなくできるようになります。

    • ポインタレシーバ

      値レシーバとの違いを実験で確かめ、変更が呼び出し元に効く理由を説明できます。

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

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

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

    メモ

    構造体のスライス

    ⌘S で保存