1. 1200円の商品
  2. 切り捨てが起きる商品
  3. 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分

メソッド

型に振る舞いを付ける

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つのメソッドで揃える

入出力例

priceLabel("きのこ図鑑", 1200) → "きのこ図鑑 税込1320円" priceLabel("古い辞書", 999) → "古い辞書 税込1098円" priceLabel("おまけ", 0) → "おまけ 税込0円"

ヒント

`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 で保存