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

2018年9月11日GoA Tour of Go,Goのお勉強,Go言語,ファンクション,戻り値Go,A Tour of Go,Goのお勉強,Go言語,ファンクション,戻り値

記事ヘッダー_Named_return_values

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

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

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

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

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

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

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

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

3. 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.)

https://golang.org/ref/spec#Return_statements
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
}

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

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

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

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

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

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

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

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

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

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

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

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

もしも return が無かったら?

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

missing return at end of function

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

さいごに

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

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

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

「Go言語のお勉強」インデックス

このシリーズについて

「A Tour of Go」を題材にした記事は現在書き直し中…。_(:3」∠)_
ほとんどサボりが原因で尻切れとなっていたシリーズですが、最近になってようやく続きを書きたくなり再開をしようと思ったんです。が、古い記事を見返すとデータ・フォーマットが古かったり内容が分かり難かったりに気づきまして、、、この際だからと最初の記事から書き直しをすることになりました…