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

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

このコミットは、Go言語の仕様書(doc/go_spec.html)から、型が指定されていない定数リテラルのデフォルト型に関する冗長で古い定義を削除するものです。具体的には、varキーワードを用いた変数宣言において、初期値が型なし定数である場合のデフォルト型に関する記述と、その例示コードが削除され、代わりに「Assignments(代入)」のセクションを参照するように変更されています。

コミット

commit 6a47bb4974ae6908ba34e16c6a0fd6b6e2d15909
Author: Russ Cox <rsc@golang.org>
Date:   Fri Dec 9 00:12:49 2011 -0500

    spec: remove redundant, outdated definition of default literal types
    
    R=golang-dev, r
    CC=golang-dev
    https://golang.org/cl/5480047

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

https://github.com/golang/go/commit/6a47bb4974ae6908ba34e16c6a0fd6b6e2d15909

元コミット内容

このコミットの目的は、「デフォルトリテラル型の冗長で古い定義を削除する」ことです。これは、Go言語の仕様書において、型が明示されていない定数リテラルが変数に代入される際のデフォルトの型推論に関する記述が、他のセクション(特に「Assignments」セクション)の内容と重複しているか、あるいは古くなっているために行われました。

変更の背景

Go言語の仕様は、言語の進化とともに常に洗練されていきます。初期の仕様書では、特定の概念について複数の場所で説明が重複していたり、時間の経過とともに表現がより簡潔かつ正確な形に整理されることがあります。

このコミットが行われた2011年12月は、Go言語がまだ比較的新しく、仕様が活発に議論され、固められていた時期にあたります。この時期には、言語のセマンティクス(意味論)をより一貫性のある形で記述するための変更が頻繁に行われていました。

「型なし定数(untyped constant)」のデフォルト型に関するルールは、Go言語の型システムの中核をなす重要な部分です。初期の仕様書では、var宣言におけるデフォルト型推論の例が具体的に記述されていましたが、言語の設計が進むにつれて、この挙動が「代入(Assignments)」の一般的なルールの一部としてより包括的に説明されるようになったと考えられます。そのため、特定のセクションでの冗長な説明は削除され、一元化された記述への参照に置き換えられました。これにより、仕様書全体の整合性が向上し、読者が最新かつ正確な情報を参照できるようになります。

前提知識の解説

このコミットを理解するためには、以下のGo言語の概念が前提となります。

1. Go言語の型システム

Go言語は静的型付け言語であり、すべての変数には型があります。しかし、Goには「型なし定数(untyped constants)」という概念が存在します。これは、リテラル値(例: 10, 3.14, "hello", true)が、特定の型に束縛されることなく、その値自体として存在することを意味します。型なし定数は、コンパイル時にその値が既知であるため、より柔軟な型変換が可能です。

2. 型なし定数のデフォルト型

型なし定数は、それが使用される文脈によって型が決定されます。もし明示的な型が与えられない場合、Goコンパイラは特定のデフォルト型を推論します。

  • 真偽値リテラル (true, false): デフォルトで bool 型。
  • 整数リテラル (10, 0xFF): デフォルトで int 型。Goの整数リテラルは「理想的な数(ideal numbers)」として扱われ、オーバーフローしない限り任意の精度を持つことができます。
  • 浮動小数点数リテラル (3.14, 1.23e7): デフォルトで float64 型。
  • 複素数リテラル (0i, 1+1i): デフォルトで complex128 型。
  • ルーンリテラル ('a'): デフォルトで rune 型(int32 のエイリアス)。
  • 文字列リテラル ("hello", `raw string`): デフォルトで string 型。

3. 変数宣言と型推論

Go言語では、変数を宣言する際に明示的に型を指定することも、初期値から型を推論させることもできます。

  • 明示的な型指定: var x int = 10
  • 型推論(varキーワード): var x = 10 この場合、10は型なし整数定数であり、コンパイラはデフォルトのルールに従ってxの型をintと推論します。
  • 短縮変数宣言(:=: x := 10 これも型推論の一種であり、xの型はintと推論されます。短縮変数宣言は、常に初期値から型を推論します。

4. Go言語の仕様書(Go Spec)

Go言語の仕様書は、Go言語の構文とセマンティクスを定義する公式ドキュメントです。言語の挙動に関する最終的な権威であり、コンパイラの実装やプログラマの理解の基盤となります。仕様書はセクションに分かれており、各概念が詳細に説明されています。

技術的詳細

このコミットは、Go言語の仕様書(doc/go_spec.html)内の特定のセクションの変更です。変更の核心は、varキーワードを使った変数宣言で初期値が型なし定数である場合の型推論に関する記述の簡素化と一元化です。

変更前は、以下のような具体的な例とともに、各型なし定数(真偽値、整数、浮動小数点数、複素数、文字列)がそれぞれどのデフォルト型に推論されるかが明示的に記述されていました。

<p>
If the type is absent and the corresponding expression evaluates to an
untyped <a href="#Constants">constant</a>, the type of the declared variable
is <code>bool</code>, <code>int</code>, <code>float64</code>,
<code>complex128</code>, or <code>string</code> respectively, depending on
whether the value is a boolean, integer, floating-point, complex, or string
constant:
</p>

<pre>
var b  = true    // t  has type bool
var r  = 'a'     // r  has type int
var i  = 0       // i  has type int
var f  = 3.0     // f  has type float64
var c0 = 0i      // c0 has type complex128
var c1 = 1 + 0i  // c1 has type complex128
var c2 = 1 + 1i  // c2 has type complex128
var s1 = "OMDB"  // s1 has type string
var s2 = `foo`   // s2 has type string
</pre>

この記述は、var宣言における型推論の挙動を具体的に示していましたが、Go言語の型なし定数から型付きの値への変換ルールは、より一般的な「Assignments(代入)」のセクションで既に定義されています。代入のルールは、変数宣言の初期化だけでなく、関数呼び出しの引数、戻り値、複合リテラルの要素など、Go言語の様々な文脈で型なし定数が型を持つ際に適用されます。

このコミットでは、上記の冗長な説明と例示コードを削除し、代わりに「Assignments」セクションへの参照に置き換えることで、仕様書全体の整合性を高め、情報の重複を排除しています。

変更後の記述は以下のようになります。

<p>
If the type is absent and the corresponding expression evaluates to an
untyped <a href="#Constants">constant</a>, the type of the declared variable
is as described in §<a href="#Assignments">Assignments</a>.
</p>

これは、「型が指定されておらず、対応する式が型なし定数に評価される場合、宣言される変数の型は、§Assignments(代入)で記述されている通りである」という意味になります。これにより、読者は型なし定数の型推論に関する詳細なルールを、言語全体に適用される一貫したルールが記述されている「Assignments」セクションで確認するよう促されます。

この変更は、Go言語の仕様書がよりDRY(Don't Repeat Yourself)原則に従い、一貫性のある参照構造を持つようにするための改善の一環です。

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

変更は doc/go_spec.html ファイルの1箇所のみです。

--- a/doc/go_spec.html
+++ b/doc/go_spec.html
@@ -1778,23 +1778,7 @@ of the expression list.
 <p>
 If the type is absent and the corresponding expression evaluates to an
 untyped <a href=\"#Constants\">constant</a>, the type of the declared variable
-- is <code>bool</code>, <code>int</code>, <code>float64</code>,\n-- <code>complex128</code>, or <code>string</code> respectively, depending on\n-- whether the value is a boolean, integer, floating-point, complex, or string\n-- constant:\n-- </p>\n--\n-- <pre>\n-- var b  = true    // t  has type bool
-- var r  = 'a'     // r  has type int
-- var i  = 0       // i  has type int
-- var f  = 3.0     // f  has type float64
-- var c0 = 0i      // c0 has type complex128
-- var c1 = 1 + 0i  // c1 has type complex128
-- var c2 = 1 + 1i  // c2 has type complex128
-- var s1 = "OMDB"  // s1 has type string
-- var s2 = `foo`   // s2 has type string
-- </pre>\n-+ is as described in §<a href=\"#Assignments\">Assignments</a>.\n 
 <h3 id=\"Short_variable_declarations\">Short variable declarations</h3>

具体的には、17行が削除され、1行が追加されています。

コアとなるコードの解説

削除された部分は、var宣言で型が省略され、初期値が型なし定数である場合に、その変数がどのようなデフォルト型を持つかについて、具体的な型名と例示コードで説明していました。

  • bool, int, float64, complex128, string といったデフォルト型が列挙されていました。
  • var b = true (bool), var r = 'a' (int), var i = 0 (int), var f = 3.0 (float64), var c0 = 0i (complex128), var s1 = "OMDB" (string) といった具体的なコード例が示されていました。

追加された1行は、この詳細な説明を、Go言語仕様書の別のセクションである「Assignments(代入)」への参照に置き換えています。

is as described in §<a href="#Assignments">Assignments</a>.

この変更により、var宣言における型推論のルールが、より一般的な代入のルールの一部として扱われるようになり、仕様書全体の一貫性が向上しました。読者は、型なし定数の型推論に関する詳細な挙動を知るために、代入のセクションを参照することになります。これは、Go言語の設計思想として、特定の文脈に限定されない一般的なルールを定義し、それを参照させることで、仕様の重複を避け、簡潔さを保つアプローチを示しています。

関連リンク

参考にした情報源リンク