コース一覧
    Go基礎:制御構文
    複数戻り値(Goならでは)

    Go基礎:制御構文

    Goの分岐、反復、関数、エラー処理を体系的に学ぶ基礎コースです。

    1
    制御構文(forしかない世界)
    01. Goのif15分
    02. forしかない世界15分
    03. forの七変化15分
    04. Goのswitch15分
    05. 定番: FizzBuzz15分
    06. ループで集計15分
    07. つくる: 商品集計20分
    08. 第3章クイズ10分
    2
    関数とエラー処理
    01. funcで関数を作る15分
    02. 複数戻り値(Goならでは)15分
    03. if err != nil(Goの心臓)15分
    04. エラーを作る15分
    05. deferで後始末15分
    06. つくる: 検証つき関数群20分
    07. 第4章クイズ10分

    複数戻り値(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円、無ければ 商品名 は見つかりません を返す

    ヒント

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