コース一覧
    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分

    初期化とフィールド

    3つの作り方

    Go

    // 1. フィールド名を指定する
    item := Item{Name: "きのこ図鑑", Price: 1200, Category: "本"}
    
    // 2. 順番に並べる
    item := Item{"きのこ図鑑", 1200, "本"}
    
    // 3. ゼロ値で作ってから入れる
    var item Item
    item.Name = "きのこ図鑑"

    1つ目を使ってください。 2つ目は短く書けますが、問題があります。

    順番指定が壊れるとき

    Go

    type Item struct {
    	Name     string
    	Price    int
    	Category string
    }
    
    item := Item{"きのこ図鑑", 1200, "本"}

    ここで構造体にフィールドを1つ足すとします。

    Go

    type Item struct {
    	Name     string
    	Stock    int      // 追加した
    	Price    int
    	Category string
    }

    さっきの行はコンパイルエラーになります。個数が合わないからです。

    足すだけならエラーで気づけます。怖いのは並べ替えたときです。

    Go

    type Item struct {
    	Name     string
    	Category string  // Price の前に移した
    	Price    int
    }

    個数は変わっていないので、Item{"きのこ図鑑", 1200, "本"} は……と言いたいところですが、この場合は型が合わないのでやはりエラーになります。同じ型どうしを入れ替えたときだけ、エラーにならずに値が入れ替わります。Name と Category はどちらも文字列なので、この2つを入れ替えると商品名と分類が黙って逆になります。

    フィールド名を書いておけば、順番も個数も関係ありません。

    一部だけ指定できる

    Go

    item := Item{Name: "きのこ図鑑"}
    // Price は 0、Category は ""

    書かなかったフィールドはゼロ値になります。エラーにはなりません。

    便利ですが、書き忘れに気づけないという面もあります。第2章のゼロ値のところで触れた話が、そのまま構造体にも当てはまります。必須の項目がある型なら、後のレッスンでやる New 関数で守ります。

    読み書き

    Go

    item.Name          // 読む
    item.Price = 1300  // 書く

    ドットでたどります。入れ子になっていても同じです。

    代入するとコピーされる

    構造体は、配列と同じ側です。

    Go

    a := Item{Name: "きのこ図鑑"}
    b := a
    b.Name = "中古スマホ"
    
    fmt.Println(a.Name)   // きのこ図鑑 のまま

    b は a のコピーなので、書き換えても a には影響しません。関数に渡したときも同じです。

    Go

    func rename(i Item) {
    	i.Name = "別の名前"   // コピーを変えただけ
    }

    この性質が、次の次のレッスンで扱うポインタレシーバの話につながります。書き換えたいのに反映されない、という詰まりどころの原因がここにあります。

    要件

    1. Item{Name: ..., Price: ...} の形でフィールド名を指定して作る
    2. 値引き後の価格を item.Price に代入して更新する
    3. 値引き後がマイナスになる場合は 0 にする
    4. 商品名 元の価格円 → 新しい価格円 の形を返す

    ヒント

    `item.Price = after` のように、ドットで指定して書き換えます

    マイナスになるかどうかは代入の前に確かめます。`if after < 0 { after = 0 }` です

    表示の1つ目の価格は引数の `price`、2つ目は更新後の `item.Price` です

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

    関連レッスン

    • メソッド

      型に振る舞いを持たせ、税込価格を返すメソッドを書けるようになります。

    • ポインタレシーバ

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

    • New関数の慣習

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

    • 構造体のスライス

      []Itemで一覧を持ち、全データを構造体前提に移行できるようになります。

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

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

    • フィールドクラスが持つデータ
    • コンパイルソースをバイトコードへ変換する処理
    • 分類カテゴリを当てる教師ありタスク
    • 関数処理に名前を付けて再利用できる単位
    • 配列サイズ固定の同型データの集まり
    main.go
    エディタを読み込んでいます

    メモ

    初期化とフィールド

    ⌘S で保存