A Tour of Go をやる! – その8 「Named return values」 お前は戻り値だ… 【Go言語/A Tour of Go】

記事ヘッダー_Named_return_values IT

「A Tour of Go をやる!」シリーズの第8回目。

少しシツコイですが、またまたまた「Function」絡みで戻り値な記事。
どれだけ似たような内容が続いても、私は「A Tour of Go」のレールを走ります…!(脱線しなければな…)

- PR -

今回進めるページ「Named return values」

ページへのリンクはこちら。

A Tour of Go

タイトルの「Named return values」とは?

「戻り値には名前をつけられるよ~」という事のようです。
次の項で詳しく見てみます。

戻り値のパラメータに関する言語仕様を見てみる

言語仕様の該当箇所はこちら。

  1. The expression list may be empty if the function’s result type specifies names for its result parameters. The result parameters act as ordinary local variables and the function may assign values to them as necessary. The “return” statement returns the values of these variables.

関数の結果タイプが結果パラメーターの名前を指定している場合、式リストは空になる可能性があります。結果パラメータは通常のローカル変数として機能し、関数は必要に応じてそれらに値を割り当てることができます。 「return」ステートメントは、これらの変数の値を返します。(by Google Translated.)

The Go Programming Language Specification - The Go Programming Language
Go
func complexF3() (re float64, im float64) {
	re = 7.0
	im = 4.0
	return
}

func (devnull) Write(p []byte) (n int, _ error) {
	n = len(p)
	return
}
Expand

翻訳がやや残念な感じで内容が飲み込み難いんですが、つまり…

  • 戻り値のパラメータ(変数名と型の定義)が指定されていれば、それらを変数としてファンクション内で扱えるよ~
  • 戻り値のパラメータが指定されているときは、return ステートメントの Expression List が省略できるよ~
  • return ステートメントの Expression List が省略されたときは、戻り値のパラメータに指定された変数が返却されるよ~

って書いてあるようです。(私の意訳ですが…)

まっ「A Tour of Go」のページで同様の説明がされてますがね。|д゚)カイテアルヨ

サンプルプログラムを見てみる

今回のサンプルプログラムはこちら。要所にコメント書いてみました。

Go
package main

import "fmt"

// (x, y int) が戻り値のパラメータ
func split(sum int) (x, y int) {

  x = sum * 4 / 9
  y = sum - x

  // リターンステートメントの Expression List を省略すると、
  // 戻り値のパラメータに定義された変数が充てがわれるので、こんなイメージ
  // return x, y
  return

}

func main() {

  // ついでにコレも…
  // このサンプルのように Println の引数に split ファンクションを書くと、
  // split ファンクションの戻り値(x と y の値)が Println の引数として扱われるので、こんなイメージ
  // fmt.Println( 7, 10 ) 
  fmt.Println(split(17))

}
Expand

Go Playground

戻り値のパラメータに書かれた変数の定義

コメントにも書きましたが6行目の最後らへん (x, y int) ですね。
こいつらは通常の変数として扱えるようです。(8~9行目のように…)

リターンステートメントの式を省略

リターンステートメントの Expression List ですが、次の部分になります。

Go
return (返却する変数等が書かれるココの事)
Expand

サンプルプログラムではこれが省略されているので、戻り値のパラメータに定義された変数がそのまま返される形となります。

もしも return が無かったら?

勢い余って(?) return すら省略しちゃうと…、こんなエラーメッセージが出力されました。

missing return at end of function

「(リターンパラメータは指定してるくせに)何でリターンが無いねん??」ってことでしょうか…(・ω・`;

さいごに

戻り値の省略パターンをラーニングした。(`・ω・´)

というわけで今回ラーニングした手法は「naked return」と言うらしく、なるべく短いファンクションで使うようにと、注意書きがありました。長いファンクションで使うと読みやすさに悪影響があるとのこと。

そんなわけで今回はここまで。また次回~。_(┐「ε:)_

コメント

タイトルとURLをコピーしました