[インデックス 1792] ファイルの概要
コミット
commit ef1b9653dd1cb8b626c2ce13432c7bdcc9ea5744
Author: Rob Pike <r@golang.org>
Date: Mon Mar 9 22:35:06 2009 -0700
conversions are mostly cleaned up; bring the spec in line.
R=gri
DELTA=31 (12 added, 18 deleted, 1 changed)
OCL=25974
CL=25976
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/ef1b9653dd1cb8b626c2ce13432c7bdcc9ea5744
元コミット内容
このコミットは、Go言語の仕様書 doc/go_spec.html
を更新し、型変換(conversions)に関する記述を整理し、実際の言語実装と整合させることを目的としています。特に、以前の仕様書に記載されていた型変換に関する未解決の課題や疑問点("Biggest open issues" や "Smaller issues" セクション)が解決済みとしてマークされ、関連するTODOコメントが削除されています。
具体的には、以下の点が変更されています。
doc/go_spec.html
から、型変換に関する古いTODOリストが削除されました。これには、「現在の状況は混乱している」「同じことに対して2つ(3つ?)の異なる表記法がある」「型アサーションが必要な場合が不明確」「型変換が適用できる場所が不明確」「type T int;
の場合、T(3.0)
と書けるか?」「チャネル変換(チャネルの方向)が必要か?」といった項目が含まれていました。- 同様に、
need for type switch?
やIs . import implemented / do we still need it?
、Do we allow empty statements?
といった、言語の構文や機能に関する疑問点も解決済みとしてClosed
セクションに移動されました。 TODO: We need to finalize the details of conversions.
という赤字のコメントが削除され、型変換の仕様が固まったことを示しています。Conversions work for any type; doc says only numeric types and strings.
という、実装とドキュメントの不一致を指摘するコメントも削除されました。これは、ドキュメントが実装に合わせて更新されたことを意味します。
変更の背景
このコミットが行われた2009年3月は、Go言語がまだ一般に公開される前の開発初期段階にありました。Go言語は、その設計思想としてシンプルさと実用性を重視しており、型システムもその例外ではありませんでした。しかし、初期の設計段階では、型変換のセマンティクスや構文に関して、まだ不明確な点や議論の余地がある部分が存在していました。
コミットメッセージにある「conversions are mostly cleaned up; bring the spec in line.」という記述から、この時期までにGo言語の型変換に関する主要な設計上の決定がなされ、実装がそれに追いついたことが伺えます。このコミットは、その実装の進捗に合わせて、公式な言語仕様書を最新の状態に保つためのものです。特に、型変換はプログラミング言語において非常に基本的な操作であり、その挙動が明確であることは言語の安定性と使いやすさにとって不可欠です。
この変更は、Go言語の初期開発における重要なマイルストーンの一つであり、言語の安定した仕様を確立するための継続的な努力の一環として位置づけられます。
前提知識の解説
Go言語の型システムと型変換
Go言語は静的型付け言語であり、変数は特定の型を持ちます。異なる型の値を扱う場合、多くの場合、型変換(Type Conversion)が必要になります。Goにおける型変換は、C言語のような暗黙的な型変換(implicit conversion)を極力避け、明示的な型変換(explicit conversion)を推奨する設計思想を持っています。これにより、予期せぬ型変換によるバグを防ぎ、コードの可読性を高めることを目指しています。
Go言語における型変換の基本的な構文は、T(x)
の形式です。ここで T
は変換先の型、x
は変換元の値です。例えば、int(3.14)
は浮動小数点数 3.14
を整数型に変換します。
型アサーション (Type Assertion)
Go言語には、インターフェース型に格納された値の基底の具体的な型を動的に調べるための「型アサーション」という仕組みがあります。これは x.(T)
の形式で記述され、x
がインターフェース型の変数である場合に、その値が型 T
であると主張(アサート)します。型アサーションは、型変換とは異なり、インターフェースの背後にある具体的な型を取り出すために使用されます。このコミットの変更前のTODOリストに「型アサーションが必要な場合が不明確」とあることから、初期のGo言語では型変換と型アサーションの概念がまだ明確に区別されていなかった可能性が示唆されます。
Go言語の仕様書 (Go Spec)
Go言語の公式な仕様書は、言語の構文、セマンティクス、標準ライブラリの動作などを詳細に記述した文書です。Go言語の開発は「仕様が先行し、実装がそれに続く」というアプローチで進められることが多く、仕様書は言語の設計と進化の中心的な役割を果たします。このコミットで更新された doc/go_spec.html
は、Go言語の初期の仕様書であり、HTML形式で提供されていました。
OCL (Original Change List) と CL (Change List)
Go言語の開発では、変更を管理するために「Change List (CL)」という概念が使われます。これは、Perforceなどのバージョン管理システムで使われる用語に由来します。OCLは "Original Change List" の略で、おそらく関連する変更の元のCL番号を指していると考えられます。CLは、このコミット自体のCL番号を示しています。
技術的詳細
このコミットの技術的な詳細は、主にGo言語の仕様書 doc/go_spec.html
の変更内容に集約されます。
1. 未解決課題リストの整理
コミットの差分を見ると、doc/go_spec.html
の冒頭にある「Biggest open issues」や「Smaller issues」セクションから、型変換に関する複数の項目が削除されています。これらの項目は、Go言語の型変換の設計がまだ固まっていなかった時期に、議論や検討が必要な課題としてリストアップされていたものです。
削除された主な項目は以下の通りです。
- Conversions:
- current situation is messy
- 2 (3?) different notations for the same thing
- unclear when a type assertion is needed
- unclear where conversions can be applied
- for type T int; can we say T(3.0) ?
- do we need channel conversion (channel direction) これらの項目が削除されたことは、Go言語の型変換のセマンティクスと構文がこの時点で明確に定義され、実装がそれに追いついたことを意味します。特に、「2 (3?) different notations for the same thing」という記述は、初期のGo言語で型変換の構文に複数の選択肢があったか、あるいは混乱があったことを示唆しており、このコミットによってそれが統一されたと考えられます。
また、「need for type switch?」「Is . import implemented / do we still need it?」「Do we allow empty statements?」といった、言語の他の側面に関する疑問点も Closed
セクションに移動されています。これは、これらの設計上の決定もこの時期までに完了したことを示しています。
2. TODOコメントの削除
TODO: We need to finalize the details of conversions.
という赤字のコメントが削除されています。これは、型変換に関する詳細が最終決定され、仕様書に反映されたことを明確に示しています。
3. 実装とドキュメントの整合性
Conversions work for any type; doc says only numeric types and strings.
というコメントが削除されたことも重要です。これは、以前の仕様書が型変換を数値型と文字列型に限定していると誤解を招く可能性があったのに対し、実際の実装ではより広範な型に対して型変換が機能していたことを示しています。このコメントの削除は、仕様書が実際の言語の挙動を正確に反映するように更新されたことを意味します。
これらの変更は、Go言語の初期開発における仕様策定のプロセスを示しており、言語の設計が議論され、実装され、そして最終的に仕様書に落とし込まれていく過程を垣間見ることができます。型変換の明確化は、Go言語の型安全性を確保し、開発者が直感的にコードを書けるようにするための重要なステップでした。
コアとなるコードの変更箇所
このコミットで変更されたファイルは doc/go_spec.html
のみです。
--- a/doc/go_spec.html
+++ b/doc/go_spec.html
@@ -3,13 +3,6 @@
<!--
Biggest open issues:
[ ] General iterators
-[ ] Conversions:
-\t- current situation is messy
-\t- 2 (3?) different notations for the same thing
-\t- unclear when a type assertion is needed
-\t- unclear where conversions can be applied
-\t- for type T int; can we say T(3.0) ?
-\t- do we need channel conversion (channel direction)
[ ] Semantics of type declaration:
\t- creating a new type (status quo), or only a new type name?
\t- also: declaration type T S; strips methods of S. why/why not?
@@ -21,7 +14,6 @@ Decisions in need of integration into the doc:
Todo's:
-[ ] there is some funny-ness regarding ';' and empty statements and label decls
[ ] document illegality of package-external tuple assignments to structs
w/ private fields: P.T(1, 2) illegal since same as P.T(a: 1, b: 2) for
a T struct { a b int }.
@@ -46,11 +38,7 @@ Wish list:
Smaller issues:
-[ ] need for type switch? (or use type assertion with ok in tuple assignment?)\n-[ ] Is . import implemented / do we still need it?\n-[ ] Do we allow empty statements? If so, do we allow empty statements after a label?\n- and if so, does a label followed by an empty statement (a semicolon) still denote\n-\ta for loop that is following, and can break L be used inside it?\n+[ ] do we need channel conversion (channel direction)\n
Closed:
@@ -125,6 +113,18 @@ Closed:
[x] should binary <- be at lowest precedence level? when is a send/receive non-blocking? (NO - 9/19/08)\n [x] func literal like a composite type - should probably require the '&' to get address (NO)\n [x] & needed to get a function pointer from a function? (NO - there is the "func" keyword - 9/19/08)\n+[x] Conversions:\n+\t- current situation is messy\n+\t- 2 (3?) different notations for the same thing\n+\t- unclear when a type assertion is needed\n+\t- unclear where conversions can be applied\n+\t- for type T int; can we say T(3.0) ?\n+[x] need for type switch? (or use type assertion with ok in tuple assignment?)\n+[x] Is . import implemented / do we still need it?\n+[x] Do we allow empty statements? If so, do we allow empty statements after a label?\n+ and if so, does a label followed by an empty statement (a semicolon) still denote\n+\ta for loop that is following, and can break L be used inside it?\n+[x] there is some funniness regarding ';' and empty statements and label decls\n
-->
@@ -3643,8 +3643,6 @@ space allocated in the underlying array (for a slice) or map. For a slice\n <h3>Conversions</h3>\n \n <p>\n-<font color=red>TODO: We need to finalize the details of conversions.</font>\n-<br/>\n Conversions look like function calls of the form\n </p>\n \n@@ -4183,15 +4181,11 @@ The following minimal alignment properties are guaranteed:\n <font color=red>\n Implementation accepts only ASCII digits for digits; doc says Unicode.\n <br/>\n-Implementation does not allow p.x where p is the local package name.\n-<br/>\n Implementation does not honor the restriction on goto statements and targets (no intervening declarations).\n <br/>\n cap() does not work on maps or chans.\n <br/>\n len() does not work on chans.\n-<br/>\n-Conversions work for any type; doc says only numeric types and strings.\n </font>\n </p>\n
コアとなるコードの解説
このコミットの「コード」は、Go言語の仕様書であるHTMLドキュメントそのものです。したがって、変更の解説は、このドキュメントのどの部分がどのように修正されたかに焦点を当てます。
-
未解決課題リストからの削除と「Closed」セクションへの移動:
doc/go_spec.html
の冒頭付近にある「Biggest open issues」および「Smaller issues」セクションから、型変換に関する複数の項目が削除されています。- これらの削除された項目は、HTMLドキュメントの後半にある「Closed」セクションに、
[x]
マーク付きで移動されています。これは、これらの課題が解決済みであることを示しています。 - 特に注目すべきは、型変換に関する詳細な疑問点(例: 「2 (3?) different notations for the same thing」)が解決済みとしてマークされたことです。これは、Go言語の型変換の構文とセマンティクスがこの時点で統一され、明確になったことを示唆しています。
-
TODOコメントの削除:
<h3>Conversions</h3>
の直下にあった<font color=red>TODO: We need to finalize the details of conversions.</font>
という赤字のTODOコメントが削除されました。これは、型変換に関する仕様の詳細が最終的に決定され、ドキュメントに反映されたことを意味します。
-
実装とドキュメントの不一致に関するコメントの削除:
- ドキュメントの末尾近くにあった、実装とドキュメントの不一致を指摘するコメント群の中から、
Conversions work for any type; doc says only numeric types and strings.
という行が削除されました。これは、型変換が数値型と文字列型に限定されるというドキュメントの記述が、実際の実装(任意の型で機能する)に合わせて修正されたことを示しています。これにより、仕様書が言語の実際の挙動を正確に反映するようになりました。
- ドキュメントの末尾近くにあった、実装とドキュメントの不一致を指摘するコメント群の中から、
これらの変更は、Go言語の初期開発段階において、言語の設計が成熟し、その仕様が文書化されていく過程を明確に示しています。特に型変換のような基本的な機能の明確化は、言語の安定性と将来的な拡張性にとって非常に重要です。
関連リンク
- Go言語の公式ウェブサイト: https://go.dev/
- Go言語の初期の仕様書(現在のものとは異なる可能性があります): Go言語の仕様書は進化しており、このコミット当時のHTML版は現在のものとは異なります。現在の仕様書は https://go.dev/ref/spec で確認できます。
参考にした情報源リンク
- Go言語の公式ドキュメント
- Go言語のGitHubリポジトリのコミット履歴
- Go言語の設計に関する初期の議論やメーリングリストのアーカイブ(一般には公開されていない可能性が高いですが、Go言語の設計思想を理解する上で重要です)
- Go言語の歴史に関する記事や書籍