[インデックス 12400] ファイルの概要
このコミットは、Go言語の標準ライブラリunicode/utf8パッケージが、unicodeパッケージへの依存関係を解消するための変更です。具体的には、unicodeパッケージから2つの定数(unicode.ReplacementCharとunicode.MaxRune)をインポートする代わりに、utf8パッケージ内でこれらの定数をローカルに定義し、テストでその等価性を検証するように修正されています。これにより、utf8パッケージの独立性が高まり、依存関係が簡素化されます。
コミット
commit d9832987ba95f8feb016fc5d22d77793659b94ef
Author: Rob Pike <r@golang.org>
Date: Tue Mar 6 11:14:45 2012 +1100
unicode/utf8: remove dependence on unicode.
The dependency was there only to pull in two constants.
Now we define them locally and verify equality in the test.
R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/5754046
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/d9832987ba95f8feb016fc5d22d77793659b94ef
元コミット内容
このコミットの元の内容は以下の通りです。
unicode/utf8: remove dependence on unicode. The dependency was there only to pull in two constants. Now we define them locally and verify equality in the test.
これは、「unicode/utf8パッケージからunicodeへの依存を削除する。この依存は2つの定数を取得するためだけに存在していた。これからはそれらをローカルで定義し、テストで等価性を検証する。」という意味です。
変更の背景
Go言語の標準ライブラリは、モジュール性と独立性を重視して設計されています。unicode/utf8パッケージはUTF-8エンコーディングの処理に特化しており、その機能のためにunicodeパッケージから特定の定数(unicode.ReplacementCharとunicode.MaxRune)をインポートしていました。
しかし、これらの定数はutf8パッケージのコア機能にとって本質的なものであり、かつその値が固定されているため、外部パッケージに依存する必要性は低いと判断されました。外部パッケージへの不必要な依存は、コンパイル時の依存関係の複雑さを増し、潜在的な循環参照のリスクや、将来的なパッケージ構造変更時の影響範囲を広げる可能性があります。
このコミットの背景には、utf8パッケージの自己完結性を高め、依存関係グラフを簡素化するという設計思想があります。これにより、utf8パッケージはより独立して機能し、他のパッケージの変更による影響を受けにくくなります。また、unicodeパッケージの変更がutf8パッケージに直接影響を与える可能性も低減されます。
前提知識の解説
UTF-8 (Unicode Transformation Format - 8-bit)
UTF-8は、Unicode文字を可変長バイトシーケンスでエンコードするための文字エンコーディング方式です。ASCII互換性があり、1バイトから4バイトでUnicodeコードポイントを表現します。
- ASCII互換性: 0-127の範囲の文字(基本的なラテン文字、数字、記号など)は1バイトで表現され、ASCIIと完全に互換性があります。
- 可変長エンコーディング: 文字によって必要なバイト数が異なります。これにより、使用頻度の高い文字は少ないバイト数で表現され、効率的なストレージと転送が可能です。
- 自己同期性: UTF-8バイトシーケンスは、不正なバイトシーケンスが検出された場合でも、次の有効な文字の開始位置を比較的容易に特定できる特性(自己同期性)を持っています。
Unicode
Unicodeは、世界中のあらゆる文字を統一的に扱うための文字コード標準です。各文字には一意の「コードポイント」が割り当てられます。
- コードポイント (Code Point): Unicodeで文字を識別するための数値です。通常、
U+XXXXの形式で表記されます(例:U+0041は'A')。 - Rune (Go言語におけるUnicode文字): Go言語では、
rune型はUnicodeコードポイントを表すために使用される組み込みのエイリアス型です。これはint32型と同じです。
unicodeパッケージ (Go言語)
Go言語の標準ライブラリunicodeパッケージは、Unicode文字のプロパティ(カテゴリ、スクリプトなど)や、大文字・小文字変換、正規化などの操作を提供します。
unicode.ReplacementChar: Unicodeの「置換文字」を表すコードポイントです。通常、U+FFFD(``) で表現され、不正なバイトシーケンスや変換エラーが発生した場合に、その文字の代わりに表示されます。Go言語ではrune型で定義されています。unicode.MaxRune: Unicodeで定義されている最大の有効なコードポイントを表します。これはUU+10FFFFです。この値を超えるコードポイントは、Unicodeの範囲外と見なされます。
unicode/utf8パッケージ (Go言語)
Go言語の標準ライブラリunicode/utf8パッケージは、UTF-8エンコーディングされたバイトシーケンスとrune(Unicodeコードポイント)間の変換、およびUTF-8シーケンスの検証を行うための機能を提供します。
utf8.RuneError:unicode.ReplacementCharと同じ意味を持つ、utf8パッケージ内で定義されるエラーを表すrune定数です。utf8.MaxRune:unicode.MaxRuneと同じ意味を持つ、utf8パッケージ内で定義される最大の有効なUnicodeコードポイントを表す定数です。
技術的詳細
このコミットの技術的な核心は、Go言語のパッケージ間の依存関係の管理と、定数の定義方法にあります。
Go言語では、パッケージは明確な依存関係を持つべきであり、不必要な依存は避けるべきです。unicode/utf8パッケージはUTF-8エンコーディングの低レベルな処理を担当しており、その機能はUnicodeの基本的な概念(エラー文字や最大コードポイント)に依存しますが、これらの値自体はunicodeパッケージの複雑なロジックやデータ構造に依存するものではありません。
コミット前のutf8.goでは、unicode.ReplacementCharとunicode.MaxRuneをインポートして使用していました。これは、これらの定数がunicodeパッケージで既に定義されていたため、再定義を避けるという観点からは合理的でした。しかし、これによりutf8パッケージはunicodeパッケージ全体に依存することになります。
このコミットでは、この依存関係を解消するために、以下の変更が行われました。
- 定数のローカル定義:
unicode.ReplacementCharとunicode.MaxRuneと同じ値を持つ定数RuneErrorとMaxRuneをutf8.go内に直接定義しました。RuneError = '\uFFFD'MaxRune = '\U0010FFFF'これらの値はUnicode標準で固定されており、変更されることはありません。
- テストでの等価性検証:
utf8_test.goのinit()関数内で、新しく定義されたローカル定数MaxRuneとRuneErrorが、それぞれunicode.MaxRuneとunicode.ReplacementCharと等しいことを実行時に検証するアサーションを追加しました。if MaxRune != unicode.MaxRune { panic("utf8.MaxRune is wrong") }if RuneError != unicode.ReplacementChar { panic("utf8.RuneError is wrong") }これにより、将来的にunicodeパッケージのこれらの定数の値が誤って変更された場合でも、utf8パッケージのテストが失敗し、問題が早期に検出されるようになります。これは、依存関係を削除しつつも、値の一貫性を保証するための堅牢なアプローチです。
この変更により、unicode/utf8パッケージはunicodeパッケージへの直接的なインポートを必要としなくなり、より軽量で独立したパッケージとなりました。これは、Go言語の標準ライブラリ設計におけるモジュール性と依存関係の最小化という原則に合致しています。
コアとなるコードの変更箇所
このコミットによる主要なコード変更は、以下の2つのファイルに集中しています。
src/pkg/unicode/utf8/utf8.gosrc/pkg/unicode/utf8/utf8_test.go
src/pkg/unicode/utf8/utf8.go の変更
--- a/src/pkg/unicode/utf8/utf8.go
+++ b/src/pkg/unicode/utf8/utf8.go
@@ -6,13 +6,16 @@
// UTF-8. It includes functions to translate between runes and UTF-8 byte sequences.
package utf8
-import "unicode" // only needed for a couple of constants
+// The conditions RuneError==unicode.ReplacementChar and
+// MaxRune==unicode.MaxRune are verified in the tests.
+// Defining them locally avoids this package depending on package unicode.
// Numbers fundamental to the encoding.
const (
-\tRuneError = unicode.ReplacementChar // the "error" Rune or "replacement character".
-\tRuneSelf = 0x80 // characters below Runeself are represented as themselves in a single byte.
-\tUTFMax = 4 // maximum number of bytes of a UTF-8 encoded Unicode character.
+\tRuneError = '\uFFFD' // the "error" Rune or "Unicode replacement character"
+\tRuneSelf = 0x80 // characters below Runeself are represented as themselves in a single byte.
+\tMaxRune = '\U0010FFFF' // Maximum valid Unicode code point.
+\tUTFMax = 4 // maximum number of bytes of a UTF-8 encoded Unicode character.
)
const (
@@ -309,7 +312,7 @@ func EncodeRune(p []byte, r rune) int {
\t\treturn 2
\t}\
\n-\tif uint32(r) > unicode.MaxRune {\n+\tif uint32(r) > MaxRune {\n \t\tr = RuneError\n \t}\
\n
src/pkg/unicode/utf8/utf8_test.go の変更
--- a/src/pkg/unicode/utf8/utf8_test.go
+++ b/src/pkg/unicode/utf8/utf8_test.go
@@ -7,9 +7,20 @@ package utf8_test
import (
\t"bytes"
\t"testing"
+\t"unicode"
\t. "unicode/utf8"
)
\n+// Validate the constants redefined from unicode.
+func init() {
+\tif MaxRune != unicode.MaxRune {
+\t\tpanic("utf8.MaxRune is wrong")
+\t}\
+\tif RuneError != unicode.ReplacementChar {
+\t\tpanic("utf8.RuneError is wrong")
+\t}\
+}\n+\n type Utf8Map struct {
\tr rune
\tstr string
コアとなるコードの解説
src/pkg/unicode/utf8/utf8.go
import "unicode"の削除: 変更前はimport "unicode" // only needed for a couple of constantsというコメントと共にunicodeパッケージがインポートされていました。このコミットでは、このインポート文が完全に削除されました。これにより、utf8パッケージはunicodeパッケージへの直接的な依存を失います。- 定数のローカル定義:
constブロック内で、RuneErrorとMaxRuneの定義が変更されました。RuneError = unicode.ReplacementCharからRuneError = '\uFFFD'へ変更。\uFFFDはUnicodeの置換文字(U+FFFD)を表すGo言語のリテラル表現です。MaxRuneが新しく追加され、MaxRune = '\U0010FFFF'と定義されました。\U0010FFFFはUnicodeの最大有効コードポイント(U+10FFFF)を表すGo言語のリテラル表現です。UTFMaxとRuneSelfは変更されていません。
EncodeRune関数の変更:EncodeRune関数内のif uint32(r) > unicode.MaxRune {という条件式が、新しく定義されたローカル定数MaxRuneを使用するようにif uint32(r) > MaxRune {と変更されました。これにより、unicodeパッケージへの依存が完全に排除されました。
src/pkg/unicode/utf8/utf8_test.go
import "unicode"の追加: テストファイルでは、新しく定義されたローカル定数とunicodeパッケージの元の定数を比較するために、import "unicode"が追加されました。これはテストのための一時的な依存であり、本番コードの依存関係とは異なります。init()関数の追加: Go言語のinit()関数は、パッケージが初期化される際に自動的に実行される特殊な関数です。このコミットでは、utf8_test.goにinit()関数が追加されました。 このinit()関数内では、以下の2つのアサーションが行われています。if MaxRune != unicode.MaxRune { panic("utf8.MaxRune is wrong") }:utf8パッケージでローカルに定義されたMaxRuneが、unicodeパッケージのMaxRuneと等しくない場合、パニック(プログラムの異常終了)を引き起こします。if RuneError != unicode.ReplacementChar { panic("utf8.RuneError is wrong") }: 同様に、utf8パッケージでローカルに定義されたRuneErrorが、unicodeパッケージのReplacementCharと等しくない場合、パニックを引き起こします。 これらのチェックは、utf8パッケージがunicodeパッケージへの依存を削除した後も、その定数の値がUnicode標準に準拠していることを保証するための重要な安全策です。これにより、将来的にunicodeパッケージの定数が変更されたり、utf8パッケージのローカル定義が誤って変更されたりした場合に、ビルド時またはテスト実行時に問題が検出されます。
関連リンク
- Go言語の
unicode/utf8パッケージのドキュメント: https://pkg.go.dev/unicode/utf8 - Go言語の
unicodeパッケージのドキュメント: https://pkg.go.dev/unicode - Unicode Consortium: https://home.unicode.org/
- UTF-8 - Wikipedia: https://ja.wikipedia.org/wiki/UTF-8
参考にした情報源リンク
- Go言語の公式ドキュメント
- Wikipedia (UTF-8, Unicode)
- Go言語のソースコード (特に
src/pkg/unicode/utf8/とsrc/pkg/unicode/) - Go言語のコミット履歴とコードレビューコメント (CL 5754046)
[インデックス 12400] ファイルの概要
このコミットは、Go言語の標準ライブラリunicode/utf8パッケージが、unicodeパッケージへの依存関係を解消するための変更です。具体的には、unicodeパッケージから2つの定数(unicode.ReplacementCharとunicode.MaxRune)をインポートする代わりに、utf8パッケージ内でこれらの定数をローカルに定義し、テストでその等価性を検証するように修正されています。これにより、utf8パッケージの独立性が高まり、依存関係が簡素化されます。
コミット
commit d9832987ba95f8feb016fc5d22d77793659b94ef
Author: Rob Pike <r@golang.org>
Date: Tue Mar 6 11:14:45 2012 +1100
unicode/utf8: remove dependence on unicode.
The dependency was there only to pull in two constants.
Now we define them locally and verify equality in the test.
R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/5754046
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/d9832987ba95f8feb016fc5d22d77793659b94ef
元コミット内容
このコミットの元の内容は以下の通りです。
unicode/utf8: remove dependence on unicode. The dependency was there only to pull in two constants. Now we define them locally and verify equality in the test.
これは、「unicode/utf8パッケージからunicodeへの依存を削除する。この依存は2つの定数を取得するためだけに存在していた。これからはそれらをローカルで定義し、テストで等価性を検証する。」という意味です。
変更の背景
Go言語の標準ライブラリは、モジュール性と独立性を重視して設計されています。unicode/utf8パッケージはUTF-8エンコーディングの処理に特化しており、その機能のためにunicodeパッケージから特定の定数(unicode.ReplacementCharとunicode.MaxRune)をインポートしていました。
しかし、これらの定数はutf8パッケージのコア機能にとって本質的なものであり、かつその値が固定されているため、外部パッケージに依存する必要性は低いと判断されました。外部パッケージへの不必要な依存は、コンパイル時の依存関係の複雑さを増し、潜在的な循環参照のリスクや、将来的なパッケージ構造変更時の影響範囲を広げる可能性があります。
このコミットの背景には、utf8パッケージの自己完結性を高め、依存関係グラフを簡素化するという設計思想があります。これにより、utf8パッケージはより独立して機能し、他のパッケージの変更による影響を受けにくくなります。また、unicodeパッケージの変更がutf8パッケージに直接影響を与える可能性も低減されます。
前提知識の解説
UTF-8 (Unicode Transformation Format - 8-bit)
UTF-8は、Unicode文字を可変長バイトシーケンスでエンコードするための文字エンコーディング方式です。ASCII互換性があり、1バイトから4バイトでUnicodeコードポイントを表現します。
- ASCII互換性: 0-127の範囲の文字(基本的なラテン文字、数字、記号など)は1バイトで表現され、ASCIIと完全に互換性があります。
- 可変長エンコーディング: 文字によって必要なバイト数が異なります。これにより、使用頻度の高い文字は少ないバイト数で表現され、効率的なストレージと転送が可能です。
- 自己同期性: UTF-8バイトシーケンスは、不正なバイトシーケンスが検出された場合でも、次の有効な文字の開始位置を比較的容易に特定できる特性(自己同期性)を持っています。
Unicode
Unicodeは、世界中のあらゆる文字を統一的に扱うための文字コード標準です。各文字には一意の「コードポイント」が割り当てられます。
- コードポイント (Code Point): Unicodeで文字を識別するための数値です。通常、
U+XXXXの形式で表記されます(例:U+0041は'A')。 - Rune (Go言語におけるUnicode文字): Go言語では、
rune型はUnicodeコードポイントを表すために使用される組み込みのエイリアス型です。これはint32型と同じです。
unicodeパッケージ (Go言語)
Go言語の標準ライブラリunicodeパッケージは、Unicode文字のプロパティ(カテゴリ、スクリプトなど)や、大文字・小文字変換、正規化などの操作を提供します。
unicode.ReplacementChar: Unicodeの「置換文字」を表すコードポイントです。通常、U+FFFD(``) で表現され、不正なバイトシーケンスや変換エラーが発生した場合に、その文字の代わりに表示されます。Go言語ではrune型で定義されています。unicode.MaxRune: Unicodeで定義されている最大の有効なコードポイントを表します。これはU+10FFFFです。この値を超えるコードポイントは、Unicodeの範囲外と見なされます。
unicode/utf8パッケージ (Go言語)
Go言語の標準ライブラリunicode/utf8パッケージは、UTF-8エンコーディングされたバイトシーケンスとrune(Unicodeコードポイント)間の変換、およびUTF-8シーケンスの検証を行うための機能を提供します。
utf8.RuneError:unicode.ReplacementCharと同じ意味を持つ、utf8パッケージ内で定義されるエラーを表すrune定数です。utf8.MaxRune:unicode.MaxRuneと同じ意味を持つ、utf8パッケージ内で定義される最大の有効なUnicodeコードポイントを表す定数です。
技術的詳細
このコミットの技術的な核心は、Go言語のパッケージ間の依存関係の管理と、定数の定義方法にあります。
Go言語では、パッケージは明確な依存関係を持つべきであり、不必要な依存は避けるべきです。unicode/utf8パッケージはUTF-8エンコーディングの低レベルな処理を担当しており、その機能はUnicodeの基本的な概念(エラー文字や最大コードポイント)に依存しますが、これらの値自体はunicodeパッケージの複雑なロジックやデータ構造に依存するものではありません。
コミット前のutf8.goでは、unicode.ReplacementCharとunicode.MaxRuneをインポートして使用していました。これは、これらの定数がunicodeパッケージで既に定義されていたため、再定義を避けるという観点からは合理的でした。しかし、これによりutf8パッケージはunicodeパッケージ全体に依存することになります。
このコミットでは、この依存関係を解消するために、以下の変更が行われました。
- 定数のローカル定義:
unicode.ReplacementCharとunicode.MaxRuneと同じ値を持つ定数RuneErrorとMaxRuneをutf8.go内に直接定義しました。RuneError = '\uFFFD'MaxRune = '\U0010FFFF'これらの値はUnicode標準で固定されており、変更されることはありません。
- テストでの等価性検証:
utf8_test.goのinit()関数内で、新しく定義されたローカル定数MaxRuneとRuneErrorが、それぞれunicode.MaxRuneとunicode.ReplacementCharと等しいことを実行時に検証するアサーションを追加しました。if MaxRune != unicode.MaxRune { panic("utf8.MaxRune is wrong") }if RuneError != unicode.ReplacementChar { panic("utf8.RuneError is wrong") }これにより、将来的にunicodeパッケージのこれらの定数の値が誤って変更された場合でも、utf8パッケージのテストが失敗し、問題が早期に検出されるようになります。これは、依存関係を削除しつつも、値の一貫性を保証するための堅牢なアプローチです。
この変更により、unicode/utf8パッケージはunicodeパッケージへの直接的なインポートを必要としなくなり、より軽量で独立したパッケージとなりました。これは、Go言語の標準ライブラリ設計におけるモジュール性と依存関係の最小化という原則に合致しています。
コアとなるコードの変更箇所
このコミットによる主要なコード変更は、以下の2つのファイルに集中しています。
src/pkg/unicode/utf8/utf8.gosrc/pkg/unicode/utf8/utf8_test.go
src/pkg/unicode/utf8/utf8.go の変更
--- a/src/pkg/unicode/utf8/utf8.go
+++ b/src/pkg/unicode/utf8/utf8.go
@@ -6,13 +6,16 @@
// UTF-8. It includes functions to translate between runes and UTF-8 byte sequences.
package utf8
-import "unicode" // only needed for a couple of constants
+// The conditions RuneError==unicode.ReplacementChar and
+// MaxRune==unicode.MaxRune are verified in the tests.
+// Defining them locally avoids this package depending on package unicode.
// Numbers fundamental to the encoding.
const (
-\tRuneError = unicode.ReplacementChar // the "error" Rune or "replacement character".
-\tRuneSelf = 0x80 // characters below Runeself are represented as themselves in a single byte.
-\tUTFMax = 4 // maximum number of bytes of a UTF-8 encoded Unicode character.
+\tRuneError = '\uFFFD' // the "error" Rune or "Unicode replacement character"
+\tRuneSelf = 0x80 // characters below Runeself are represented as themselves in a single byte.
+\tMaxRune = '\U0010FFFF' // Maximum valid Unicode code point.
+\tUTFMax = 4 // maximum number of bytes of a UTF-8 encoded Unicode character.
)
const (
@@ -309,7 +312,7 @@ func EncodeRune(p []byte, r rune) int {
\t\treturn 2
\t}\
\n-\tif uint32(r) > unicode.MaxRune {\n+\tif uint32(r) > MaxRune {\n \t\tr = RuneError\n \t}\
\n
src/pkg/unicode/utf8/utf8_test.go の変更
--- a/src/pkg/unicode/utf8/utf8_test.go
+++ b/src/pkg/unicode/utf8/utf8_test.go
@@ -7,9 +7,20 @@ package utf8_test
import (
\t"bytes"
\t"testing"
+\t"unicode"
\t. "unicode/utf8"
)
\n+// Validate the constants redefined from unicode.
+func init() {
+\tif MaxRune != unicode.MaxRune {
+\t\tpanic("utf8.MaxRune is wrong")
+\t}\
+\tif RuneError != unicode.ReplacementChar {
+\t\tpanic("utf8.RuneError is wrong")
+\t}\
+}\n+\n type Utf8Map struct {
\tr rune
\tstr string
コアとなるコードの解説
src/pkg/unicode/utf8/utf8.go
import "unicode"の削除: 変更前はimport "unicode" // only needed for a couple of constantsというコメントと共にunicodeパッケージがインポートされていました。このコミットでは、このインポート文が完全に削除されました。これにより、utf8パッケージはunicodeパッケージへの直接的な依存を失います。- 定数のローカル定義:
constブロック内で、RuneErrorとMaxRuneの定義が変更されました。RuneError = unicode.ReplacementCharからRuneError = '\uFFFD'へ変更。\uFFFDはUnicodeの置換文字(U+FFFD)を表すGo言語のリテラル表現です。MaxRuneが新しく追加され、MaxRune = '\U0010FFFF'と定義されました。\U0010FFFFはUnicodeの最大有効コードポイント(U+10FFFF)を表すGo言語のリテラル表現です。UTFMaxとRuneSelfは変更されていません。
EncodeRune関数の変更:EncodeRune関数内のif uint32(r) > unicode.MaxRune {という条件式が、新しく定義されたローカル定数MaxRuneを使用するようにif uint32(r) > MaxRune {と変更されました。これにより、unicodeパッケージへの依存が完全に排除されました。
src/pkg/unicode/utf8/utf8_test.go
import "unicode"の追加: テストファイルでは、新しく定義されたローカル定数とunicodeパッケージの元の定数を比較するために、import "unicode"が追加されました。これはテストのための一時的な依存であり、本番コードの依存関係とは異なります。init()関数の追加: Go言語のinit()関数は、パッケージが初期化される際に自動的に実行される特殊な関数です。このコミットでは、utf8_test.goにinit()関数が追加されました。 このinit()関数内では、以下の2つのアサーションが行われています。if MaxRune != unicode.MaxRune { panic("utf8.MaxRune is wrong") }:utf8パッケージでローカルに定義されたMaxRuneが、unicodeパッケージのMaxRuneと等しくない場合、パニック(プログラムの異常終了)を引き起こします。if RuneError != unicode.ReplacementChar { panic("utf8.RuneError is wrong") }: 同様に、utf8パッケージでローカルに定義されたRuneErrorが、unicodeパッケージのReplacementCharと等しくない場合、パニックを引き起こします。 これらのチェックは、utf8パッケージがunicodeパッケージへの依存を削除した後も、その定数の値がUnicode標準に準拠していることを保証するための重要な安全策です。これにより、将来的にunicodeパッケージの定数が変更されたり、utf8パッケージのローカル定義が誤って変更されたりした場合に、ビルド時またはテスト実行時に問題が検出されます。
関連リンク
- Go言語の
unicode/utf8パッケージのドキュメント: https://pkg.go.dev/unicode/utf8 - Go言語の
unicodeパッケージのドキュメント: https://pkg.go.dev/unicode - Unicode Consortium: https://home.unicode.org/
- UTF-8 - Wikipedia: https://ja.wikipedia.org/wiki/UTF-8
参考にした情報源リンク
- Go言語の公式ドキュメント
- Wikipedia (UTF-8, Unicode)
- Go言語のソースコード (特に
src/pkg/unicode/utf8/とsrc/pkg/unicode/) - Go言語のコミット履歴とコードレビューコメント (CL 5754046)