1. 200円引き
  2. 値引きなし
  3. 値引きが価格を超えるとき
  4. ちょうど0円になるとき
コース一覧
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分

初期化とフィールド

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. 商品名 元の価格円 → 新しい価格円 の形を返す

入出力例

applyDiscount("きのこ図鑑", 1200, 200) → "きのこ図鑑 1200円 → 1000円" applyDiscount("きのこ図鑑", 1200, 0) → "きのこ図鑑 1200円 → 1200円" applyDiscount("古い辞書", 800, 1000) → "古い辞書 800円 → 0円" applyDiscount("おまけ", 500, 500) → "おまけ 500円 → 0円"

ヒント

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

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

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

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

関連レッスン

  • メソッド

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

  • ポインタレシーバ

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

  • New関数の慣習

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

  • 構造体のスライス

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

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

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

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

メモ

初期化とフィールド

⌘S で保存