Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 15898] ファイルの概要

このコミットは、doc/go_spec.html ファイルに12行の追加と1行の削除を行い、合計1ファイルが変更されました。

コミット

  • コミットハッシュ: d02089101c9d8375d991b679c9a1c8432e415cd8
  • Author: Rob Pike r@golang.org
  • Date: Fri Mar 22 10:03:55 2013 -0700

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/d02089101c9d8375d991b679c9a1c8432e415cd8

元コミット内容

spec: add example showing missing return statement
Will help people find the rules by searching the spec by
having a comment saying "missing return";
"terminating statement" does not evoke the rule to the
uninitiated.

R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/7838044

変更の背景

このコミットの主な目的は、Go言語の仕様書(doc/go_spec.html)において、関数の戻り値に関するルール、特に「終端ステートメント(terminating statement)」の概念を、より直感的で理解しやすい形で示すことです。

Go言語では、戻り値を持つ関数は、その関数の本体が必ず「終端ステートメント」で終わる必要があります。これは、関数が常に値を返すことを保証するための重要なルールです。しかし、元の仕様書では「terminating statement」という専門用語が使われており、Go言語に不慣れな開発者にとっては、この用語が「戻り値の欠落」という具体的な問題と結びつきにくいという課題がありました。

Rob Pike氏(Go言語の共同開発者の一人)は、この問題を解決するため、仕様書に「missing return statement」(戻り値の欠落)というコメントを含む具体的なコード例を追加することを提案しました。これにより、開発者が「missing return」というキーワードで仕様書を検索した際に、関連するルールを容易に見つけられるようになり、また、コード例を通じてルールの意味をより明確に理解できるようになります。

前提知識の解説

Go言語の関数と戻り値の保証

Go言語では、関数が戻り値を宣言している場合、その関数の実行パスは必ず戻り値を返す必要があります。これを保証するために、「終端ステートメント(terminating statement)」という概念が導入されています。

終端ステートメントとは? Go言語の仕様において、終端ステートメントとは、そのステートメントが実行されると、そのステートメントを含むブロックや関数の実行が終了することを保証するステートメントのことです。具体的には、以下のようなステートメントが終端ステートメントと見なされます。

  • return ステートメント
  • goto ステートメント(同じ関数内のラベルにジャンプする場合)
  • fallthrough を伴わない switch ステートメントの各ケースの最後のステートメント
  • panic を呼び出す関数呼び出し(例: log.Fatal
  • 無限ループ(例: for {}

戻り値を宣言している関数では、関数の本体のステートメントリストが必ず終端ステートメントで終わる必要があります。これにより、コンパイラは関数が常に値を返すことを静的に検証できます。もし終端ステートメントがない場合、コンパイルエラーとなります。

Go言語の仕様書 (doc/go_spec.html)

doc/go_spec.html は、Go言語の公式な言語仕様書です。Go言語の構文、セマンティクス、組み込み型、ステートメント、関数、パッケージなど、言語のあらゆる側面が詳細に記述されています。開発者はこの仕様書を参照することで、Go言語の動作に関する正確な情報を得ることができます。このファイルはHTML形式で記述されており、ウェブブラウザで閲覧可能です。

技術的詳細

このコミットは、Go言語の仕様書である doc/go_spec.html ファイルに対して行われました。具体的には、関数の戻り値に関するセクションに、戻り値が欠落している無効なコード例が追加されました。

変更のポイントは以下の通りです。

  1. バージョン情報の更新: 仕様書のバージョン日付が「March 20, 2013」から「March 22, 2013」に更新されました。これは、このコミットが適用された日付を反映しています。

  2. コード例の追加: 既存の「終端ステートメント」に関する説明の直後に、以下のGoコードスニペットが追加されました。

    func findMarker(c <-chan int) int {
    	for i := range c {
    		if x := <-c; isMarker(x) {
    			return x
    		}
    	}
    	// invalid: missing return statement.
    }
    

    このコード例は、findMarker という関数が int 型の戻り値を宣言しているにもかかわらず、ループが終了した場合に return ステートメントがないため、コンパイルエラーとなることを示しています。

  3. コメントの追加: コード例の最後に // invalid: missing return statement. というコメントが追加されました。このコメントは、このコードがなぜ無効であるかを明確に示しており、特に「missing return statement」というキーワードが検索の助けとなるように意図されています。

この変更により、Go言語の仕様書は、戻り値の欠落に関するルールをより具体的に、かつ検索しやすい形で提供するようになりました。

コアとなるコードの変更箇所

--- a/doc/go_spec.html
+++ b/doc/go_spec.html
@@ -1,6 +1,6 @@
 <!--{
 	"Title": "The Go Programming Language Specification",
-\t"Subtitle": "Version of March 20, 2013",
+\t"Subtitle": "Version of March 22, 2013",
 	"Path": "/ref/spec"
 }-->
 
@@ -1964,6 +1964,17 @@ result parameters, the function body's statement list must end in
 a <a href="#Terminating_statements">terminating statement</a>.
 </p>
 
+<pre>
+func findMarker(c <-chan int) int {
+\tfor i := range c {\n+\t\tif x := <-c; isMarker(x) {\n+\t\t\treturn x\n+\t\t}\n+\t}\n+\t// invalid: missing return statement.\n+}\n+</pre>\n+\n <p>
 A function declaration may omit the body. Such a declaration provides the
 signature for a function implemented outside Go, such as an assembly routine.

コアとなるコードの解説

上記の差分は、doc/go_spec.html ファイルへの変更を示しています。

  1. Subtitle の変更:

    -	"Subtitle": "Version of March 20, 2013",
    +	"Subtitle": "Version of March 22, 2013",
    

    これは、仕様書のバージョン日付を更新した部分です。コミットが適用された日付に合わせて、仕様書の内容が最新であることを示します。

  2. コード例の追加:

    +<pre>
    +func findMarker(c <-chan int) int {
    +\tfor i := range c {\n+\t\tif x := <-c; isMarker(x) {\n+\t\t\treturn x\n+\t\t}\n+\t}\n+\t// invalid: missing return statement.\n+}\n+</pre>
    

    この部分が、今回のコミットの核心となる変更です。

    • <pre> タグは、整形済みテキスト(preformatted text)を表示するためのHTMLタグで、コードスニペットを表示する際に使用されます。
    • 追加されたGoコードは findMarker という関数を定義しています。この関数は int 型のチャネル c を受け取り、int 型の値を返すと宣言されています。
    • 関数内部では for i := range c ループがチャネルから値を受け取っています。
    • if x := <-c; isMarker(x) の条件が真の場合、return x で値を返します。
    • しかし、ループが終了した場合(チャネルがクローズされた場合など)、関数は return ステートメントに到達しません。
    • このため、最後の行に // invalid: missing return statement. というコメントが追加されています。このコメントは、このコードがGo言語のルールに違反しており、戻り値が欠落していることを明確に示しています。

この追加されたコード例とコメントにより、Go言語の仕様書は、戻り値を持つ関数が必ず終端ステートメントで終わる必要があるというルールを、より具体的なエラーケースとして提示し、開発者がこの問題を理解しやすくなるように改善されました。特に「missing return statement」というキーワードが明示されたことで、この問題で困っている開発者が仕様書を検索する際の利便性が向上しました。

関連リンク

参考にした情報源リンク

  • Go言語の公式仕様書: https://golang.org/ref/spec (このコミットが変更を加えたドキュメントの最新版)
  • Go言語の終端ステートメントに関する議論やドキュメント (一般的なGo言語の知識として)
  • コミットメッセージと差分情報
  • Web検索結果 (golang.org/cl/7838044 d02089101c9d8375d991b679c9a1c8432e415cd8)