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

    メソッド

    型に振る舞いを付ける

    Go

    func (i Item) TaxIncluded() int {
    	return int(float64(i.Price) * 1.1)
    }

    普通の関数との違いは、func の直後にある (i Item) だけです。これをレシーバと呼びます。「この関数は Item に属します」という宣言です。

    呼び出しはドットです。

    Go

    item := Item{Name: "きのこ図鑑", Price: 1200}
    item.TaxIncluded()   // 1320

    関数でも書けるのに、なぜメソッドか

    Go

    func TaxIncluded(i Item) int   // 関数
    func (i Item) TaxIncluded() int // メソッド

    中身は同じことができます。違うのはどこに属しているかです。

    メソッドにすると、Item を持っている人が item. と打った時点で、使えるものが一覧で出てきます。関数だと、名前を知らないと探せません。

    もう1つ、同じ名前を別の型に付けられます。

    Go

    func (i Item) Label() string
    func (u User) Label() string

    関数だと ItemLabel UserLabel のように名前で区別することになります。型に属させれば、それが要りません。

    レシーバの名前は短くする

    Go

    func (i Item) TaxIncluded() int   // よく見る形
    func (item Item) TaxIncluded() int // 長い

    Go では、レシーバに1文字か2文字を使う習慣があります。型の頭文字を取ることが多く、Item なら i です。

    同じ型のメソッドでは、レシーバ名を揃えるのも決まりです。あるメソッドで i、別で item と書くと、読む人が別物かと疑います。

    レシーバもコピーされる

    前のレッスンで、構造体は代入するとコピーされると書きました。メソッドのレシーバも同じです。

    Go

    func (i Item) MarkSoldOut() {
    	i.SoldOut = true   // コピーを変えただけ
    }
    
    item.MarkSoldOut()
    fmt.Println(item.SoldOut)   // false のまま

    呼んでも何も起きません。エラーも出ません。静かに効かないので、最も気づきにくい詰まりどころです。

    次のレッスンで、これを解決します。

    要件

    1. TaxIncluded は税込価格を返す。税率は1.1倍で小数は切り捨て
    2. Label は 商品名 税込N円 の形を返す
    3. Label の中から TaxIncluded を呼ぶ
    4. レシーバ名は2つのメソッドで揃える

    ヒント

    `TaxIncluded` の中身は `int(float64(i.Price) * 1.1)` です

    `Label` メソッドを新しく足します。`func (i Item) Label() string {` の形です

    `Label` の中では `i.TaxIncluded()` と書いて、自分の別のメソッドを呼べます

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

    関連レッスン

    • ポインタレシーバ

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

    • New関数の慣習

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

    • 構造体のスライス

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

    • つくる: Itemで再設計

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

    main.go
    エディタを読み込んでいます

    メモ

    メソッド

    ⌘S で保存