[インデックス 13857] ファイルの概要
このコミットは、Go言語の組み込み型である rune のドキュメントを更新するものです。具体的には、rune が int のエイリアスであるという記述を int32 のエイリアスであるという記述に修正し、将来的に int32 のエイリアスに変更されるという記述を削除しています。
コミット
commit e8de8b58caf52115be0d5d11282c504da8642238
Author: Anthony Eufemio <anthony.eufemio@gmail.com>
Date: Tue Sep 18 11:01:10 2012 -0700
builtin: Changed documentation for rune type.
Fixes #4093.
R=golang-dev, bradfitz, r
CC=golang-dev
https://golang.org/cl/6536047
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/e8de8b58caf52115be0d5d11282c504da8642238
元コミット内容
builtin: Changed documentation for rune type.
Fixes #4093.
R=golang-dev, bradfitz, r
CC=golang-dev
https://golang.org/cl/6536047
変更の背景
このコミットの背景には、Go言語における rune 型の定義に関する歴史的な経緯と、それに対するドキュメントの正確性の問題があります。コミットメッセージにある Fixes #4093 が示すように、この変更はGoのIssue 4093に対応するものです。
Go言語の初期のバージョンでは、rune は int のエイリアスとして定義されていました。しかし、rune はUnicodeコードポイントを表すために設計されており、Unicodeコードポイントは通常32ビットの符号なし整数で表現されます。Go言語の int 型は、システムアーキテクチャ(32ビットまたは64ビット)によってサイズが異なるため、rune が int のエイリアスであるという定義は、rune の本来の目的と整合性が取れていませんでした。
この不整合を解消するため、Go 1.0.3のリリースで rune は int32 のエイリアスとして正式に定義されることになりました。この変更は、rune が常に32ビットの符号付き整数として扱われることを保証し、Unicodeコードポイントの表現に適した型であることを明確にしました。
このコミットは、その実際の型定義の変更に合わせて、builtin パッケージ内の rune 型に関するドキュメントを修正し、正確な情報を提供する目的で行われました。特に、rune が将来的に int32 のエイリアスに変更されるという記述は、既に変更が完了しているため不要となり、削除されました。
前提知識の解説
Go言語の型システム
Go言語は静的型付け言語であり、変数は使用前に型を宣言する必要があります。Goには、以下のような基本的な組み込み型があります。
- 数値型:
- 整数型:
int,int8,int16,int32,int64,uint,uint8,uint16,uint32,uint64,uintptr。intとuintは、実行環境のCPUアーキテクチャ(32ビットまたは64ビット)に依存してサイズが変わります。int32は常に32ビットの符号付き整数です。 - 浮動小数点型:
float32,float64 - 複素数型:
complex64,complex128
- 整数型:
- 真偽値型:
bool - 文字列型:
string
byte 型と rune 型
Go言語には、特に文字や文字列を扱うための特別なエイリアス型が2つあります。
byte型:uint8のエイリアスです。Go言語において、文字列はUTF-8エンコードされたバイトのシーケンスとして扱われます。byte型は、このUTF-8エンコードされたバイト列の個々のバイトを表現するのに使用されます。rune型:int32のエイリアスです。runeは、Unicodeコードポイント(文字)を表すために使用されます。Goの文字列をrangeループでイテレートすると、各要素はrune型として返され、これはUTF-8でエンコードされた文字のUnicodeコードポイントに対応します。
UnicodeとUTF-8
- Unicode: 世界中のほとんどの文字体系を統一的に扱うための文字コード標準です。各文字には一意の「コードポイント」と呼ばれる数値が割り当てられています。
- UTF-8: Unicodeコードポイントをバイト列にエンコードするための可変長エンコーディング方式です。ASCII文字は1バイトで表現され、他の多くの文字は2バイト以上で表現されます。Go言語の文字列は内部的にUTF-8でエンコードされています。
rune が int32 のエイリアスであることは、Unicodeコードポイントが最大で 0x10FFFF (1,114,111) までの値を持ち、これが32ビットの符号付き整数で十分に表現できるためです。
技術的詳細
このコミットは、Go言語の標準ライブラリの一部である src/pkg/builtin/builtin.go ファイル内のドキュメントコメントを修正しています。このファイルは、Go言語に組み込まれている基本的な型や関数(例: len, cap, make, new, panic, recover など)の定義とドキュメントが含まれています。
変更の核心は、rune 型の定義に関するコメントの正確性を向上させることです。
変更前:
// rune is an alias for int and is equivalent to int in all ways. It is
// used, by convention, to distinguish character values from integer values.
// In a future version of Go, it will change to an alias of int32.
type rune rune
変更後:
// rune is an alias for int32 and is equivalent to int32 in all ways. It is
// used, by convention, to distinguish character values from integer values.
type rune rune
この変更により、以下の2点が修正されました。
intからint32への変更:runeがintのエイリアスであるという記述が、int32のエイリアスであるという記述に修正されました。これは、Go 1.0.3で実際にruneの基底型がint32に変更された事実を反映しています。- 将来の変更に関する記述の削除: 「In a future version of Go, it will change to an alias of int32.」という記述が削除されました。これは、既にその「将来のバージョン」が到来し、変更が適用済みであるため、この記述が不要になったためです。
このドキュメントの修正は、Go言語のユーザーが rune 型の正確な性質と、それがUnicodeコードポイントをどのように表現するかを理解する上で非常に重要です。
コアとなるコードの変更箇所
変更は src/pkg/builtin/builtin.go ファイルの以下の部分です。
--- a/src/pkg/builtin/builtin.go
+++ b/src/pkg/builtin/builtin.go
@@ -81,9 +81,8 @@ type uintptr uintptr
// integer values.
type byte byte
-// rune is an alias for int and is equivalent to int in all ways. It is
+// rune is an alias for int32 and is equivalent to int32 in all ways. It is
// used, by convention, to distinguish character values from integer values.
-// In a future version of Go, it will change to an alias of int32.
type rune rune
// Type is here for the purposes of documentation only. It is a stand-in
コアとなるコードの解説
このコミットは、Go言語の builtin パッケージ内の rune 型のドキュメントコメントを修正しています。
- // rune is an alias for int and is equivalent to int in all ways. It is- この行は削除されました。以前のドキュメントでは
runeがintのエイリアスであると記述されていましたが、これはGo 1.0.3以降の実際の定義とは異なっていました。
- この行は削除されました。以前のドキュメントでは
+ // rune is an alias for int32 and is equivalent to int32 in all ways. It is- この行が追加されました。これにより、
runeがint32のエイリアスであり、すべての点でint32と同等であるという正確な情報が提供されます。
- この行が追加されました。これにより、
- // In a future version of Go, it will change to an alias of int32.- この行は削除されました。この記述は、
runeが将来的にint32のエイリアスに変更されることを示唆していましたが、このコミットが適用される時点では既にその変更が完了していたため、不要となりました。
- この行は削除されました。この記述は、
この変更は、コードの動作には影響を与えません。これは純粋にドキュメントの正確性を向上させるための修正であり、Go言語のユーザーが rune 型について誤解するのを防ぐことを目的としています。
関連リンク
- Go Issue 4093: https://github.com/golang/go/issues/4093
- Go Change List 6536047: https://golang.org/cl/6536047 (このコミットに対応するGoのコードレビューシステム上の変更リスト)
参考にした情報源リンク
- Go言語の公式ドキュメント: https://go.dev/doc/
- Go言語の
builtinパッケージのドキュメント: https://pkg.go.dev/builtin - Go言語のリリースノート (特にGo 1.0.3関連): https://go.dev/doc/devel/release
- Unicode Consortium: https://home.unicode.org/
- UTF-8 - Wikipedia: https://ja.wikipedia.org/wiki/UTF-8
- Go言語の
int型とint32型の違いに関する情報 (一般的なGoのチュートリアルやブログ記事)