1. 正しい商品
  2. 商品名が空
  3. 価格が0
  4. 上限超え
  5. 上限ちょうどは通る
コース一覧
Go入門
New関数の慣習

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分

New関数の慣習

不正な状態を作れなくする

構造体はどんな値でも入れられます。

Go

item := Item{Name: "", Price: -500} // 通ってしまう

名前が空で価格が負の商品ができました。エラーにはなりません。この Item が後の処理に流れていくと、どこかで壊れます。

作る時点で止めます。 そのための関数を用意するのが Go の慣習です。

Go

func NewItem(name string, price int) (*Item, error) { if name == "" { return nil, errors.New("商品名が空です") } if price <= 0 { return nil, errors.New("価格が0以下です") } return &Item{Name: name, Price: price}, nil }

第4章でやった検証が、生成と一体になりました。

New という名前

Go には constructor という仕組みがありません。ただの関数です。ただし名前の付け方に決まりがあります。

プレーンテキスト

NewItem Item を作る NewUser User を作る New パッケージの主役の型を作る

New で始めるだけで、読む人には「これは生成関数だ」と伝わります。言語の機能ではなく、名前の習慣で揃えているのが Go らしいところです。

&Item{} が返るもの

Go

return &Item{Name: name, Price: price}, nil

& は「その居場所」を意味します。前のレッスンの *Item と対になっていて、&Item{...} は「作った Item の居場所」を返します。

プレーンテキスト

*Item 居場所を表す型 &item 居場所を取り出す

生成関数がポインタを返すのは、受け取った側がメソッドで書き換えられるようにするためです。値で返すと、前のレッスンの問題がそのまま起きます。

失敗したときは nil

Go

return nil, errors.New("商品名が空です")

ポインタのゼロ値は nil です。第4章で (int, error) を返したときの 0 にあたるものが、ポインタでは nil になります。

受け取る側は、いつもの形で確かめます。

Go

item, err := NewItem("", 1200) if err != nil { return err.Error() } // ここから先、item は nil ではないと信用してよい

err を確かめずに item を使うと panic します。 nil のポインタからフィールドを読もうとするからです。第4章で「エラーを _ で捨てるな」と書いた理由が、ここでは実行時の停止という形で現れます。

要件

  1. NewItem は (*Item, error) を返す
  2. 検証の順番は 商品名が空 → 価格が0以下 → 価格が上限超え
  3. 成功時は &Item{...} と nil を返す
  4. 失敗時は nil とエラーを返す
  5. createItem は成功なら 商品名 価格円 を作成しました、失敗ならエラーの理由を返す

入出力例

createItem("きのこ図鑑", 1200) → "きのこ図鑑 1200円 を作成しました" createItem("", 1200) → "商品名が空です" createItem("きのこ図鑑", 0) → "価格が0以下です" createItem("高級品", 2000000) → "価格が上限を超えています" createItem("高級品", 1000000) → "高級品 1000000円 を作成しました"

ヒント

検証に引っかかったら `return nil, errors.New("...")` の形で返します

`createItem` の `item, _ :=` を `item, err :=` に変え、`if err != nil` で先に弾いてください

エラーを捨てたまま `item.Name` を読むと、item が nil なので実行時に止まります

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

関連レッスン

  • 構造体のスライス

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

  • つくる: Itemで再設計

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

  • 第6章クイズ

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

  • ゴルーチン

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

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

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

  • 処理計算や代入を表す長方形
  • 関数処理に名前を付けて再利用できる単位
  • メソッドクラスに属する関数
  • フィールドクラスが持つデータ
main.go
学習モード
エディタを読み込んでいます

メモ

New関数の慣習

⌘S で保存