コース一覧
    Go基礎:データ構造
    New関数の慣習

    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分

    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 は成功なら 商品名 価格円 を作成しました、失敗ならエラーの理由を返す

    ヒント

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

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

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

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

    関連レッスン

    • 構造体のスライス

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

    • つくる: Itemで再設計

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

    • 第6章クイズ

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

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

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

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

    メモ

    New関数の慣習

    ⌘S で保存