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

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

このコミットは、Go言語の公式ドキュメント「The Laws of Reflection」記事内のコード例の参照方法を修正し、それに伴い新しいコードスニペットを追加するものです。具体的には、doc/articles/laws_of_reflection.html ファイルと doc/progs/interface2.go ファイルが変更されています。

コミット

  • コミットハッシュ: 2b3d6cb5e6c8ecf6b9f7917ed84b22c94f7c906d
  • 作者: Francisco Souza franciscossouza@gmail.com
  • コミット日時: 2012年3月21日(水)16:42:04 -0700
  • コミットメッセージ:
    doc: fix typo in The Laws of Reflection article
    
    R=golang-dev, gri, r
    CC=golang-dev
    https://golang.org/cl/5876047
    

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/2b3d6cb5e6c8ecf6b9f7917ed84b22c94f7c906d

元コミット内容

このコミットの目的は、「The Laws of Reflection」という記事におけるタイプミス(typo)を修正することです。これは、記事内で参照されているコードスニペットの指定方法に関する修正であり、記事の正確性を向上させるためのものです。

変更の背景

Go言語の公式ドキュメントやブログ記事では、{{code}} ディレクティブを使用して、外部のGoソースコードファイルから特定の部分を抽出して表示する仕組みがあります。このコミットは、「The Laws of Reflection」というリフレクションに関する重要な記事において、この {{code}} ディレクティブの参照が不適切であったか、または参照したいコードスニペットが変更されたために、その参照を更新する必要が生じたことが背景にあります。

具体的には、以前は /var x/ という正規表現でコードの開始位置を指定していましたが、これはコードの変更や意図するスニペットの変更により、より明確な START f9/ というマーカーを使用するように変更されました。これに伴い、参照される側の interface2.go ファイルに、新しいマーカーに対応するコードブロックが追加されています。

前提知識の解説

Go言語のリフレクション (Reflection)

Go言語のリフレクションは、プログラムの実行時に型情報(reflect.Type)や値情報(reflect.Value)を検査・操作する機能です。これにより、コンパイル時には未知の型や構造体に対しても汎用的な処理を記述することが可能になります。例えば、JSONエンコーディング/デコーディング、データベースのORM、RPCフレームワークなどで広く利用されています。

リフレクションの主要な概念は以下の通りです。

  • reflect.Type: Goの型そのものを表します。例えば、intstringstruct { Name string } などです。reflect.TypeOf(i interface{}) 関数で取得できます。
  • reflect.Value: Goの変数の値を表します。reflect.ValueOf(i interface{}) 関数で取得できます。reflect.Value は、その値の型情報(Type()メソッドで reflect.Type を返す)や、値の操作(Int(), String(), FieldByName() など)を行うためのメソッドを提供します。
  • Kind(): reflect.Type および reflect.Value のメソッドで、その型または値の基本的なカテゴリ(例: int, struct, slice, func など)を返します。
  • Elem(): ポインタ型やインターフェース型の場合、そのポインタが指す要素の型や、インターフェースが保持する具体的な値の型を取得するために使用します。

リフレクションは強力ですが、型安全性を損なう可能性があり、パフォーマンスオーバーヘッドも伴うため、必要最小限に留めることが推奨されます。

Go言語のドキュメントにおける {{code}} ディレクティブと OMIT コメント

Go言語の公式ドキュメントやブログ記事は、go doc コマンドや godoc ツールによって生成されます。これらのドキュメントには、コード例を埋め込むための特別な構文が使用されます。

  • {{code "path/to/file.go" "start_regex" "end_regex"}}: このディレクティブは、指定されたGoソースコードファイル (path/to/file.go) から、start_regex にマッチする行から end_regex にマッチする行までのコードブロックを抽出して表示するために使用されます。start_regexend_regex は正規表現であり、コード内の特定のパターンを検索して範囲を決定します。

  • // START OMIT// STOP OMIT: Goのソースコード内で、ドキュメントに含めたいコードブロックの開始と終了を明示的に示すために使用される特別なコメントです。{{code}} ディレクティブの start_regexend_regex として、これらの OMIT コメント内の文字列(例: START f9)を指定することで、より正確かつ意図的にコードスニペットを抽出できます。これにより、コードの変更があっても、ドキュメントの参照が壊れにくくなります。

このコミットでは、まさにこの {{code}} ディレクティブの start_regex が変更され、それに合わせて OMIT コメントが追加されています。

技術的詳細

このコミットは、Go言語のリフレクションに関する公式記事「The Laws of Reflection」の正確性を向上させるためのものです。

  1. doc/articles/laws_of_reflection.html の変更: 記事内でコードスニペットを埋め込むための {{code}} ディレクティブの引数が変更されました。

    • 変更前: {{code "/doc/progs/interface2.go" /var x/ /STOP/}} これは、interface2.go ファイルから /var x/ という正規表現にマッチする行から /STOP/ にマッチする行までのコードを抽出する指示でした。
    • 変更後: {{code "/doc/progs/interface2.go" /START f9/ /STOP/}} 新しい指定では、interface2.go ファイルから /START f9/ という正規表現にマッチする行から /STOP/ にマッチする行までのコードを抽出するように変更されました。これは、より具体的なマーカーを使用することで、コードの抽出範囲を明確にし、将来的なコード変更に対する堅牢性を高める意図があります。
  2. doc/progs/interface2.go の変更: 上記の {{code}} ディレクティブの変更に対応するため、interface2.go ファイルに新しい関数 f9 が追加されました。 この f9 関数は、reflect パッケージの基本的な使用例を示しています。

    func f9() {
        // START f9 OMIT
        var x float64 = 3.4
        fmt.Println("value:", reflect.ValueOf(x))
        // STOP OMIT
    }
    

    このコードブロックには、// START f9 OMIT// STOP OMIT という特別なコメントが含まれています。これにより、laws_of_reflection.html から {{code ... /START f9/ ...}} ディレクティブを使って、この f9 関数のコードスニペットを正確に抽出できるようになります。 reflect.ValueOf(x) は、float64 型の変数 x の値 3.4reflect.Value 型のオブジェクトとして取得し、その情報を出力するものです。

この変更により、「The Laws of Reflection」記事は、より正確で意図した通りのコード例を表示できるようになります。

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

diff --git a/doc/articles/laws_of_reflection.html b/doc/articles/laws_of_reflection.html
index ca729508bb..a6175f73c1 100644
--- a/doc/articles/laws_of_reflection.html
+++ b/doc/articles/laws_of_reflection.html
@@ -238,7 +238,7 @@ value (from here on we'll elide the boilerplate and focus just on
 the executable code):
 </p>

-{{code "/doc/progs/interface2.go" `/var x/` `/STOP/`}}
+{{code "/doc/progs/interface2.go" `/START f9/` `/STOP/`}}

 <p>
 prints
diff --git a/doc/progs/interface2.go b/doc/progs/interface2.go
index 2deba32b46..a541d94e48 100644
--- a/doc/progs/interface2.go
+++ b/doc/progs/interface2.go
@@ -123,3 +123,10 @@ func f8() {\n 	fmt.Println("t is now", t)\n 	// STOP OMIT\n }\n+\n+func f9() {\n+\t// START f9 OMIT\n+\tvar x float64 = 3.4\n+\tfmt.Println("value:", reflect.ValueOf(x))\n+\t// STOP OMIT\n+}\n```

## コアとなるコードの解説

### `doc/articles/laws_of_reflection.html` の変更点

この変更は、Goドキュメントのビルドシステムがコードスニペットを抽出する方法を指示する `{{code}}` ディレクティブの引数を更新しています。

-   `- {{code "/doc/progs/interface2.go" `/var x/` `/STOP/`}}`
    -   これは、`interface2.go` ファイルから、正規表現 `/var x/` にマッチする行から `/STOP/` にマッチする行までのコードを抽出するよう指示していました。この指定方法は、コードの内容に依存するため、コードが変更されると意図しない部分が抽出されたり、抽出に失敗したりする可能性があります。

-   `+ {{code "/doc/progs/interface2.go" `/START f9/` `/STOP/`}}`
    -   新しい指定では、`interface2.go` ファイルから、正規表現 `/START f9/` にマッチする行から `/STOP/` にマッチする行までのコードを抽出するよう指示しています。`START f9` は、コード内に明示的に記述された `// START f9 OMIT` コメントに対応しており、これにより抽出範囲がより明確かつ堅牢になります。

### `doc/progs/interface2.go` の変更点

このファイルには、`laws_of_reflection.html` から参照される新しいコードスニペットが追加されています。

-   `+func f9() {`
-   `+	// START f9 OMIT`
-   `+	var x float64 = 3.4`
-   `+	fmt.Println("value:", reflect.ValueOf(x))`
-   `+	// STOP OMIT`
-   `+}`
    -   新しく追加された `f9` 関数は、Goのリフレクション機能の基本的な使用例を示しています。
    -   `var x float64 = 3.4` は、`float64` 型の変数 `x` を宣言し、値 `3.4` で初期化しています。
    -   `fmt.Println("value:", reflect.ValueOf(x))` は、`reflect.ValueOf()` 関数を使用して変数 `x` の値(`3.4`)を `reflect.Value` 型のオブジェクトとして取得し、そのオブジェクトを標準出力に表示しています。これにより、実行時に値の型や内容を検査できるリフレクションの基本的な動作が示されます。
    -   `// START f9 OMIT` と `// STOP OMIT` は、Goドキュメントのビルドシステムがこのコードブロックを正確に抽出するためのマーカーです。これにより、`laws_of_reflection.html` の `{{code}}` ディレクティブがこの特定のコードスニペットを確実に参照できるようになります。

これらの変更は、Goのドキュメントシステムにおけるコード例の管理方法のベストプラクティスを示しており、ドキュメントの正確性と保守性を向上させるものです。

## 関連リンク

-   Go言語の公式ドキュメント: [https://golang.org/](https://golang.org/)
-   Go言語のリフレクションに関する記事「The Laws of Reflection」: [https://go.dev/blog/laws-of-reflection](https://go.dev/blog/laws-of-reflection) (コミット当時のURLは `https://golang.org/doc/articles/laws_of_reflection.html` であった可能性が高いですが、現在は `go.dev` にリダイレクトされます)
-   Goのコードレビューシステム (Gerrit) の変更セットリンク: [https://golang.org/cl/5876047](https://golang.org/cl/5876047)

## 参考にした情報源リンク

-   Go言語の公式ドキュメント(リフレクションに関する情報)
-   Go言語のブログ記事「The Laws of Reflection」
-   Go言語のソースコードにおける `OMIT` コメントの慣習
-   Gitの差分(diff)の読み方に関する一般的な知識