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

[インデックス 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言語では、変数宣言にはいくつかの形式があります:

  1. 明示的な型指定を伴う宣言

    var x int = 10
    var name string = "Go"
    
  2. 型推論を使用した宣言

    var x = 10        // int型として推論
    var name = "Go"   // string型として推論
    
  3. 短縮変数宣言

    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:

実際の変更内容

  1. バージョン情報の更新:

    • 仕様書のバージョンを「October 13, 2011」から「October 17, 2011」に更新
  2. 型推論の説明文の修正:

    • 複素数定数に対するcomplex128型の型推論規則を追加
  3. コード例の追加:

    • var c = 1i // c has type complex128 の例を追加

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

変更対象ファイル: doc/go_spec.html

修正されたHTML仕様書の内容

  1. バージョン情報の更新:

    <!-- subtitle Version of October 13, 2011 -->
    

    <!-- subtitle Version of October 17, 2011 -->
    
  2. 型推論の説明文の修正:

    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:
    
  3. コード例の追加:

    <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言語の仕様書における重要な明確化の一例であり、言語の成熟過程において仕様の正確性と一貫性を保つための継続的な改善の重要性を示しています。Robert Griesemer氏による2011年のこの変更は、現在のGo言語の堅牢な型システムの基盤となる重要な貢献の一つです。