[インデックス 12266] ファイルの概要
このコミットは、Go言語の仕様書(doc/go_spec.html
)に対する変更であり、特に「関数内で宣言された変数は評価されなければならない(使用されなければならない)」という規則を明確にするものです。これは、Go言語の設計思想である「未使用の変数やインポートはコンパイルエラーとする」という厳格なポリシーを仕様レベルで明文化し、コンパイラがこの規則を強制できることを示しています。
コミット
commit 2c9e1637d2388005dc4d71dd4990b73b13c79ad0
Author: Robert Griesemer <gri@golang.org>
Date: Tue Feb 28 17:44:24 2012 -0800
go spec: inside functions, variables must be evaluated.
Fixes #1612.
R=r, rsc, iant, ken, remyoudompheng, ken, r
CC=golang-dev
https://golang.org/cl/5700068
---
doc/go_spec.html | 17 +++++++++++++----\n 1 file changed, 13 insertions(+), 4 deletions(-)
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/2c9e1637d2388005dc4d71dd4990b73b13c79ad0
元コミット内容
go spec: inside functions, variables must be evaluated.
Fixes #1612.
R=r, rsc, iant, ken, remyoudompheng, ken, r
CC=golang-dev
https://golang.org/cl/5700068
変更の背景
Go言語は、その設計思想として「シンプルさ」と「明瞭さ」を重視しています。その一環として、未使用の変数やインポートをコンパイルエラーとするという厳格なルールがあります。これは、コードの品質を向上させ、潜在的なバグ(例えば、意図しない変数のシャドウイング)を防ぎ、コンパイル時間を短縮することを目的としています。
このコミットは、Go言語の仕様書において、この「関数内で宣言された変数は使用されなければならない」という規則をより明確に定義するために行われました。特に、Fixes #1612
という記述から、GoのIssue 1612がこの未使用変数に関する挙動の明確化を求めていたことが伺えます。当時のGo言語の仕様書では、この点に関する記述が曖昧であったか、あるいはコンパイラの実装が仕様と完全に一致していなかった可能性があり、それを修正・明確化するための変更です。
前提知識の解説
Go言語の仕様書 (Go Language Specification)
Go言語の仕様書は、Go言語の構文、セマンティクス、および標準ライブラリの動作を正式に定義した文書です。Go言語のコンパイラやツールは、この仕様書に基づいて実装されます。仕様書は、言語の挙動に関する最終的な権威であり、開発者がGoプログラムがどのように動作するかを理解するための重要なリソースです。
未使用変数 (Unused Variables)
プログラミングにおいて、未使用変数とは、宣言されたものの、その後のコードで一度も読み取られたり、値が代入されたりしない変数のことです。多くのプログラミング言語では、未使用変数は警告として扱われるか、あるいは無視されます。しかし、Go言語では、未使用変数はデフォルトでコンパイルエラーとなります。
Goが未使用変数をエラーとする主な理由は以下の通りです。
- コードの品質向上: 未使用変数は、未完成のコード、デバッグ中に残されたコード、あるいは単なるタイプミスを示唆している可能性があります。これらをエラーとすることで、開発者はよりクリーンで意図が明確なコードを書くよう促されます。
- 潜在的なバグの防止: 特に、エラーを返す関数呼び出しの結果を無視する際に、エラー変数を宣言したものの使用しない場合、エラー処理が漏れている可能性を示唆します。
- コンパイル時間の短縮: コンパイラが未使用のコードパスやデータを追跡する必要がなくなるため、コンパイルプロセスが効率化されます。
Goでは、意図的に変数を無視したい場合(例えば、複数の戻り値を持つ関数で一部の値のみが必要な場合)には、ブランク識別子 _
を使用します。例: _, err := someFunction()
実装上の制約 (Implementation Restriction)
仕様書における「実装上の制約」とは、言語のセマンティクスの一部としてではなく、特定のコンパイラや実行環境が課す可能性のある追加の制約を指します。これは、言語のコアな動作には影響しないが、実装の都合上、特定の挙動が許可されない場合があることを示します。このコミットで追加された「コンパイラは、関数本体内で宣言された変数が一度も使用されない場合、その宣言を不正とすることができる」という記述は、まさにこの「実装上の制約」の一例です。これは、Goコンパイラが未使用変数をエラーとして扱うことを正当化する根拠となります。
技術的詳細
このコミットの主要な変更点は、Go言語の仕様書である doc/go_spec.html
に、関数内の未使用変数に関する「実装上の制約」を追加したことです。
具体的には、以下のHTMLスニペットが追加されました。
<p>
Implementation restriction: A compiler may make it illegal to declare a variable
inside a <a href="#Function_declarations">function body</a> if the variable is
never used.
</p>
この文言は、「コンパイラは、関数本体内で変数が一度も使用されない場合、その変数の宣言を不正とすることができる」と述べています。これは、Goコンパイラが現在行っている未使用変数に対するエラー報告の挙動を、仕様レベルで正式に許可し、正当化するものです。これにより、Go言語の厳格な未使用変数チェックが、単なるコンパイラの実装上の都合ではなく、言語仕様に裏打ちされたものであることが明確になります。
また、この変更に伴い、仕様書内の他の関連セクション(Short variable declarations
と For statements with "range" clause
)の記述も微調整され、新しく追加された「変数宣言」セクションへのリンクが追加されています。これにより、仕様書全体の整合性が保たれています。
コアとなるコードの変更箇所
変更は doc/go_spec.html
ファイルに対して行われています。
--- a/doc/go_spec.html
+++ b/doc/go_spec.html
@@ -1,6 +1,6 @@
<!--{
"Title": "The Go Programming Language Specification",
-\t"Subtitle": "Version of February 23, 2012"\n+\t"Subtitle": "Version of February 28, 2012"\n }-->
\n <!--
@@ -1832,6 +1832,13 @@ of the expression list.\n If the type is absent and the corresponding expression evaluates to an\n untyped <a href=\"#Constants\">constant</a>, the type of the declared variable\n is as described in §<a href=\"#Assignments\">Assignments</a>.\n+</p>\n+\n+<p>\n+Implementation restriction: A compiler may make it illegal to declare a variable\n+inside a <a href=\"#Function_declarations\">function body</a> if the variable is\n+never used.\n+</p>\n \n <h3 id=\"Short_variable_declarations\">Short variable declarations</h3>\n \n@@ -1844,8 +1851,8 @@ ShortVarDecl = IdentifierList \":=\" ExpressionList .\n </pre>\n \n <p>\n-It is a shorthand for a regular variable declaration with\n-initializer expressions but no types:\n+It is a shorthand for a regular <a href=\"#Variable_declarations\">variable declaration</a>\n+with initializer expressions but no types:\n </p>\n \n <pre class=\"grammar\">\n@@ -4238,7 +4245,9 @@ iteration variables as in an <a href=\"#Assignments\">assignment statement</a>.\n </p>\n \n <p>\n-The iteration variables may be declared by the \"range\" clause (<code>:=</code>).\n+The iteration variables may be declared by the \"range\" using a form of\n+<a href=\"#Short_variable_declarations\">short variable declaration</a>\n+(<code>:=</code>).\n In this case their types are set to the types of the respective iteration values\n and their <a href=\"#Declarations_and_scope\">scope</a> ends at the end of the \"for\"\n statement; they are re-used in each iteration.\n```
## コアとなるコードの解説
1. **仕様書の日付更新**:
```diff
-\t"Subtitle": "Version of February 23, 2012"\n+\t"Subtitle": "Version of February 28, 2012"\
```
これは、仕様書のバージョン日付を2012年2月23日から2012年2月28日に更新したものです。これは、このコミットがGo言語の仕様書に対する正式な更新であることを示しています。
2. **未使用変数に関する実装上の制約の追加**:
```html
<p>
Implementation restriction: A compiler may make it illegal to declare a variable
inside a <a href="#Function_declarations">function body</a> if the variable is
never used.
</p>
```
これがこのコミットの最も重要な変更点です。`Variable declarations` セクションに、関数本体内で宣言された未使用変数をコンパイラが不正とすることができるという「実装上の制約」が追加されました。これにより、Goコンパイラが未使用変数をエラーとして扱う挙動が、言語仕様によって正式に裏付けられることになります。
3. **関連セクションのリンク更新**:
```diff
-It is a shorthand for a regular variable declaration with
-initializer expressions but no types:
+It is a shorthand for a regular <a href="#Variable_declarations">variable declaration</a>
+with initializer expressions but no types:
```
```diff
-The iteration variables may be declared by the "range" clause (<code>:=</code>).
+The iteration variables may be declared by the "range" using a form of
+<a href="#Short_variable_declarations">short variable declaration</a>
+(<code>:=</code>).
```
`Short variable declarations` と `For statements with "range" clause` のセクションで、関連する変数宣言の概念へのリンクが更新されました。これにより、仕様書内の相互参照がより正確になり、読者が関連する情報を容易にたどれるようになります。
これらの変更は、Go言語の設計哲学である「シンプルさ」と「明瞭さ」を反映し、特に未使用変数に関する挙動を仕様レベルで明確にすることで、言語の厳格さと一貫性を高めるものです。
## 関連リンク
* Go言語の公式ウェブサイト: [https://go.dev/](https://go.dev/)
* Go言語の仕様書: [https://go.dev/ref/spec](https://go.dev/ref/spec)
## 参考にした情報源リンク
* Go言語のIssue 1612に関する情報(Web検索結果より、未使用変数に関する議論が示唆される)
* Go言語における未使用変数に関する一般的な情報源(Goの設計思想、ブランク識別子など)