[インデックス 10007] ファイルの概要
このコミットは、Go言語仕様において変数宣言に関する記述を明確化し、特に型が省略された変数宣言で定数を使用する際の型推論について、complex128型の扱いを追加した重要な修正です。具体的には、型なし複素数定数を使用した変数宣言時の型推論規則を明確化しています。
コミット
- コミットハッシュ: c5a6b05ba4500be3d977592e756538290defdf14
- 作成者: Robert Griesemer gri@golang.org
- 日付: 2011年10月17日 12:54:18 -0700
- コミットメッセージ: "go spec: clarifying variable declaractions w/ constants"
- 対応Issue: #2377
- レビュー: R=r, rsc
- CC: golang-dev
- Code Review URL: https://golang.org/cl/5267048
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/c5a6b05ba4500be3d977592e756538290defdf14
元コミット内容
commit c5a6b05ba4500be3d977592e756538290defdf14
Author: Robert Griesemer <gri@golang.org>
Date: Mon Oct 17 12:54:18 2011 -0700
go spec: clarifying variable declaractions w/ constants
Fixes #2377.
R=r, rsc
CC=golang-dev
https://golang.org/cl/5267048
doc/go_spec.html | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
変更の背景
2011年10月の時点で、Go言語の仕様において変数宣言の型推論に関する説明が不完全でした。特に、型が明示的に指定されていない変数宣言で定数を使用した場合の型推論について、複素数型(complex128)の扱いが抜け落ちていました。
このコミットは、issue #2377の修正として行われ、Go言語の仕様書をより正確で完全なものにするための重要な修正でした。修正前の仕様では、型なし定数を使用した変数宣言時の型推論について、bool、int、float64、stringの4つの型しか言及されていませんでしたが、実際にはcomplex128型も含まれるべきでした。
この修正により、以下の変数宣言において型推論が正しく行われることが明確化されました:
var c = 1i
→ complex128型として推論
Robert Griesemer氏(Go言語の設計者の一人)によって行われたこの修正は、言語仕様の一貫性と完全性を保つための取り組みの一環でした。
前提知識の解説
Go言語の変数宣言の基本概念
Go言語では、変数宣言にはいくつかの形式があります:
-
明示的な型指定を伴う宣言
var x int = 10 var name string = "Go"
-
型推論を使用した宣言
var x = 10 // int型として推論 var name = "Go" // string型として推論
-
短縮変数宣言
x := 10 name := "Go"
Go言語における定数の特殊性
Go言語の定数は他の多くの言語と異なり、「理想的な数値空間」で扱われます。これは以下の特徴を持ちます:
- 任意精度: 整数定数は任意の精度を持つ
- オーバーフロー/アンダーフローなし: 計算時に精度の制限がない
- 柔軟な型変換: 変数に代入される際に適切な型に変換される
定数の種類
Go言語における定数は、コンパイル時に値が決定される不変の値です。定数には以下の特徴があります:
-
型付き定数: 特定の型を持つ定数
const Pi float64 = 3.14159 const MaxInt int = 1000
-
型なし定数: 型が明示されていない定数(より柔軟な使用が可能)
const Pi = 3.14159 const MaxInt = 1000
Robert Griesemer氏について
Robert Griesemer氏は、Go言語の共同開発者の一人であり、Rob Pike、Ken Thompsonと共にGoogle社でGo言語を設計しました。彼は特に言語仕様の設計と型システムの開発において中心的な役割を果たしました。
- 経歴: スイス連邦工科大学(ETH Zurich)で博士号取得
- Google入社: 2002年
- Go言語開発: 2007年から参加
- 専門分野: プログラミング言語設計、型システム、コンパイラ技術
技術的詳細
このコミットでは、doc/go_spec.html
ファイルに対して10行の変更(6行の追加、4行の削除)が行われました。これらの変更は、型が省略された変数宣言で型なし定数を使用する際の型推論規則を完全に文書化することを目的としています。
変更前の仕様
修正前の仕様では、型が省略された変数宣言で型なし定数を使用した場合の型推論について、以下のように記述されていました:
If the type is absent and the corresponding expression evaluates to an
untyped constant, the type of the declared variable
is bool, int, float64, or string
respectively, depending on whether the value is a boolean, integer,
floating-point, or string constant:
この記述では、複素数定数に対する型推論の規則が欠落していました。
変更後の仕様
修正後の仕様では、complex128型が追加され、より完全な記述になりました:
If the type is absent and the corresponding expression evaluates to an
untyped constant, the type of the declared variable
is bool, int, float64, complex128, or string respectively, depending on
whether the value is a boolean, integer, floating-point, complex, or string
constant:
実際の変更内容
-
バージョン情報の更新:
- 仕様書のバージョンを「October 13, 2011」から「October 17, 2011」に更新
-
型推論の説明文の修正:
- 複素数定数に対するcomplex128型の型推論規則を追加
-
コード例の追加:
var c = 1i // c has type complex128
の例を追加
コアとなるコードの変更箇所
変更対象ファイル: doc/go_spec.html
修正されたHTML仕様書の内容
-
バージョン情報の更新:
<!-- subtitle Version of October 13, 2011 -->
↓
<!-- subtitle Version of October 17, 2011 -->
-
型推論の説明文の修正:
is <code>bool</code>, <code>int</code>, <code>float64</code>, or <code>string</code> respectively, depending on whether the value is a boolean, integer, floating-point, or string constant:
↓
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:
-
コード例の追加:
<pre> var b = true // t has type bool var i = 0 // i has type int var f = 3.0 // f has type float64 var s = "OMDB" // s has type string </pre>
↓
<pre> var b = true // t has type bool var i = 0 // i has type int var f = 3.0 // f has type float64 var c = 1i // c has type complex128 var s = "OMDB" // s has type string </pre>
変更統計:
- 変更ファイル数: 1
- 追加行数: 6
- 削除行数: 4
- 純増行数: 2
コアとなるコードの解説
型推論の動作
この修正により、以下の変数宣言パターンにおける型推論の動作が明確になりました:
var b = true // bool型と推論される
var i = 0 // int型と推論される
var f = 3.0 // float64型と推論される
var c = 1i // complex128型と推論される(新規追加)
var s = "OMDB" // string型と推論される
複素数リテラルの処理
1i
のような複素数リテラルは、型なし複素数定数として扱われ、変数宣言時に型が省略されている場合、デフォルトでcomplex128型が割り当てられます。これは、他の数値型がデフォルトで最も精度の高い型(int、float64)を選択するのと一貫性があります。
型システムの完全性
この修正により、Go言語の基本的な型なし定数の種類すべてに対する型推論規則が完全に定義されました:
- 型なしブール定数 → bool
- 型なし整数定数 → int
- 型なし浮動小数点定数 → float64
- 型なし複素数定数 → complex128
- 型なし文字列定数 → string
複素数型の特徴
Go言語では複素数を扱うための専用の型が提供されています:
complex64
: 32ビット浮動小数点数を実部・虚部に持つ複素数complex128
: 64ビット浮動小数点数を実部・虚部に持つ複素数
複素数リテラルは i
サフィックスを使用して表現されます:
var c1 = 1i // 虚数単位(0+1i)
var c2 = 3 + 4i // 実部3、虚部4の複素数
var c3 = complex(3, 4) // 関数を使用した複素数生成
この修正により、複素数を使用する数値計算において、型推論が適切に機能することが保証されるようになりました。
関連リンク
参考にした情報源リンク
- Go Programming Language Specification
- Constants - The Go Programming Language
- Understanding the complex128 Type in Golang
- 3.3 Complex Numbers - The Go Programming Language [Book]
- Types in the Go Programming Language | Medium
このコミットは、Go言語の仕様書における重要な明確化の一例であり、言語の成熟過程において仕様の正確性と一貫性を保つための継続的な改善の重要性を示しています。Robert Griesemer氏による2011年のこの変更は、現在のGo言語の堅牢な型システムの基盤となる重要な貢献の一つです。