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

[インデックス 12400] ファイルの概要

このコミットは、Go言語の標準ライブラリunicode/utf8パッケージが、unicodeパッケージへの依存関係を解消するための変更です。具体的には、unicodeパッケージから2つの定数(unicode.ReplacementCharunicode.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.ReplacementCharunicode.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.ReplacementCharunicode.MaxRuneをインポートして使用していました。これは、これらの定数がunicodeパッケージで既に定義されていたため、再定義を避けるという観点からは合理的でした。しかし、これによりutf8パッケージはunicodeパッケージ全体に依存することになります。

このコミットでは、この依存関係を解消するために、以下の変更が行われました。

  1. 定数のローカル定義: unicode.ReplacementCharunicode.MaxRuneと同じ値を持つ定数RuneErrorMaxRuneutf8.go内に直接定義しました。
    • RuneError = '\uFFFD'
    • MaxRune = '\U0010FFFF' これらの値はUnicode標準で固定されており、変更されることはありません。
  2. テストでの等価性検証: utf8_test.goinit()関数内で、新しく定義されたローカル定数MaxRuneRuneErrorが、それぞれunicode.MaxRuneunicode.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つのファイルに集中しています。

  1. src/pkg/unicode/utf8/utf8.go
  2. src/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

  1. import "unicode" の削除: 変更前はimport "unicode" // only needed for a couple of constantsというコメントと共にunicodeパッケージがインポートされていました。このコミットでは、このインポート文が完全に削除されました。これにより、utf8パッケージはunicodeパッケージへの直接的な依存を失います。
  2. 定数のローカル定義: constブロック内で、RuneErrorMaxRuneの定義が変更されました。
    • RuneError = unicode.ReplacementChar から RuneError = '\uFFFD' へ変更。\uFFFDはUnicodeの置換文字(U+FFFD)を表すGo言語のリテラル表現です。
    • MaxRuneが新しく追加され、MaxRune = '\U0010FFFF' と定義されました。\U0010FFFFはUnicodeの最大有効コードポイント(U+10FFFF)を表すGo言語のリテラル表現です。
    • UTFMaxRuneSelfは変更されていません。
  3. EncodeRune関数の変更: EncodeRune関数内のif uint32(r) > unicode.MaxRune {という条件式が、新しく定義されたローカル定数MaxRuneを使用するようにif uint32(r) > MaxRune {と変更されました。これにより、unicodeパッケージへの依存が完全に排除されました。

src/pkg/unicode/utf8/utf8_test.go

  1. import "unicode" の追加: テストファイルでは、新しく定義されたローカル定数とunicodeパッケージの元の定数を比較するために、import "unicode"が追加されました。これはテストのための一時的な依存であり、本番コードの依存関係とは異なります。
  2. init() 関数の追加: Go言語のinit()関数は、パッケージが初期化される際に自動的に実行される特殊な関数です。このコミットでは、utf8_test.goinit()関数が追加されました。 この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言語の公式ドキュメント
  • Wikipedia (UTF-8, Unicode)
  • Go言語のソースコード (特にsrc/pkg/unicode/utf8/src/pkg/unicode/)
  • Go言語のコミット履歴とコードレビューコメント (CL 5754046)

[インデックス 12400] ファイルの概要

このコミットは、Go言語の標準ライブラリunicode/utf8パッケージが、unicodeパッケージへの依存関係を解消するための変更です。具体的には、unicodeパッケージから2つの定数(unicode.ReplacementCharunicode.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.ReplacementCharunicode.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.ReplacementCharunicode.MaxRuneをインポートして使用していました。これは、これらの定数がunicodeパッケージで既に定義されていたため、再定義を避けるという観点からは合理的でした。しかし、これによりutf8パッケージはunicodeパッケージ全体に依存することになります。

このコミットでは、この依存関係を解消するために、以下の変更が行われました。

  1. 定数のローカル定義: unicode.ReplacementCharunicode.MaxRuneと同じ値を持つ定数RuneErrorMaxRuneutf8.go内に直接定義しました。
    • RuneError = '\uFFFD'
    • MaxRune = '\U0010FFFF' これらの値はUnicode標準で固定されており、変更されることはありません。
  2. テストでの等価性検証: utf8_test.goinit()関数内で、新しく定義されたローカル定数MaxRuneRuneErrorが、それぞれunicode.MaxRuneunicode.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つのファイルに集中しています。

  1. src/pkg/unicode/utf8/utf8.go
  2. src/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

  1. import "unicode" の削除: 変更前はimport "unicode" // only needed for a couple of constantsというコメントと共にunicodeパッケージがインポートされていました。このコミットでは、このインポート文が完全に削除されました。これにより、utf8パッケージはunicodeパッケージへの直接的な依存を失います。
  2. 定数のローカル定義: constブロック内で、RuneErrorMaxRuneの定義が変更されました。
    • RuneError = unicode.ReplacementChar から RuneError = '\uFFFD' へ変更。\uFFFDはUnicodeの置換文字(U+FFFD)を表すGo言語のリテラル表現です。
    • MaxRuneが新しく追加され、MaxRune = '\U0010FFFF' と定義されました。\U0010FFFFはUnicodeの最大有効コードポイント(U+10FFFF)を表すGo言語のリテラル表現です。
    • UTFMaxRuneSelfは変更されていません。
  3. EncodeRune関数の変更: EncodeRune関数内のif uint32(r) > unicode.MaxRune {という条件式が、新しく定義されたローカル定数MaxRuneを使用するようにif uint32(r) > MaxRune {と変更されました。これにより、unicodeパッケージへの依存が完全に排除されました。

src/pkg/unicode/utf8/utf8_test.go

  1. import "unicode" の追加: テストファイルでは、新しく定義されたローカル定数とunicodeパッケージの元の定数を比較するために、import "unicode"が追加されました。これはテストのための一時的な依存であり、本番コードの依存関係とは異なります。
  2. init() 関数の追加: Go言語のinit()関数は、パッケージが初期化される際に自動的に実行される特殊な関数です。このコミットでは、utf8_test.goinit()関数が追加されました。 この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言語の公式ドキュメント
  • Wikipedia (UTF-8, Unicode)
  • Go言語のソースコード (特にsrc/pkg/unicode/utf8/src/pkg/unicode/)
  • Go言語のコミット履歴とコードレビューコメント (CL 5754046)