1. きのこ図鑑
  2. 中古スマホ
  3. 0円だが存在する商品
  4. 存在しない商品
コース一覧
Go入門
複数戻り値(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ならでは)

2つ返せる

Go

func divide(a, b int) (int, int) { return a / b, a % b } quotient, remainder := divide(10, 3) // 3, 1

戻り値の型を括弧で並べると、複数を返せます。受け取る側もカンマで並べます。

多くの言語では、2つ返したいときに配列やオブジェクトに詰める必要があります。Go はそのまま返せます。

何のためにあるのか

本当の狙いは「2つの計算結果を返す」ことではありません。結果と、うまくいったかどうかを一緒に返すことです。

Go

func findPrice(name string) (int, bool) { if name == "きのこ図鑑" { return 1200, true } return 0, false }

2つ目の bool が「見つかったか」を表します。

これが無いと、見つからなかったときに何を返せばよいか困ります。0 を返すと、0円の商品と区別が付きません。第2章のゼロ値のところで触れた「正しい 0 なのか、入れ忘れた 0 なのか分からない」という問題が、ここで解決します。

Go

price, found := findPrice("謎の箱") if !found { return "見つかりません" }

! は「でない」という意味です。found が偽のときに真になります。

使わない戻り値は _ にする

2つ返るうち片方が要らないとき、変数を作ると「使っていない」と怒られます。

Go

price, found := findPrice("きのこ図鑑") fmt.Println(price) // found を使っていないのでエラー

こういうときは _ を使います。

Go

price, _ := findPrice("きのこ図鑑")

_ は「受け取るけれど捨てる」という印です。変数ではないので、使わなくても怒られません。

ただし、これを乱用すると失敗を握りつぶすことになります。次のレッスンで扱う error を _ で捨てるのは、Go で最も嫌われる書き方の1つです。

戻り値に名前を付けられる

Go

func findPrice(name string) (price int, found bool) { ... }

戻り値にも名前を付けられます。読む人に「1つ目が価格、2つ目が見つかったか」と伝わります。

短い関数では書かないことのほうが多いですが、戻り値が3つ以上あって順番を間違えそうなときには効きます。

要件

  1. findPrice は (int, bool) を返す
  2. きのこ図鑑 は 1200、中古スマホ は 24800、おまけ は 0。いずれも見つかった扱い
  3. それ以外は 0 と見つからなかった扱い
  4. describeSearch は見つかったら 商品名 N円、無ければ 商品名 は見つかりません を返す

入出力例

describeSearch("きのこ図鑑") → "きのこ図鑑 1200円" describeSearch("中古スマホ") → "中古スマホ 24800円" describeSearch("おまけ") → "おまけ 0円" describeSearch("謎の箱") → "謎の箱 は見つかりません"

ヒント

`findPrice` は `return 1200, true` のようにカンマで2つ返します

`describeSearch` では `price, found := findPrice(name)` と2つ受け取ります。初期コードの `_` を `found` に変えてください

`おまけ` は 0円ですが存在します。価格が0かどうかではなく、2つ目の戻り値で判定してください

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

関連レッスン

  • if err != nil(Goの心臓)

    errorを受けて分岐する型を身につけ、失敗を無視しないコードを書けるようになります。

  • エラーを作る

    errors.Newとfmt.Errorfで自分のエラーを返し、理由の分かる失敗を作れるようになります。

  • deferで後始末

    関数の終わりに実行する処理を予約し、開始と終了のログを対で出せるようになります。

  • つくる: 検証つき関数群

    第4章の知識で出品の検証と計算をerror付きの関数にまとめられるようになります。

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

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

  • 戻り値呼び出し元への返答を表す点線矢印
  • 配列サイズ固定の同型データの集まり
  • オブジェクトキーと値のペアで構造を作るデータ
  • 変数データに名前をつけて参照する仕組み
  • 関数処理に名前を付けて再利用できる単位
main.go
学習モード
エディタを読み込んでいます

メモ

複数戻り値(Goならでは)

⌘S で保存