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

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

このコミットでは、Go言語の標準ライブラリである html/templatenet/httpwebsocket パッケージ内のコメントに記載されているインポートパスが修正されています。具体的には、src/pkg/html/template/doc.gosrc/pkg/net/http/server.gosrc/pkg/websocket/client.gosrc/pkg/websocket/server.go の4つのファイルが変更されました。これらの変更は、コードの機能には影響を与えず、ドキュメントや例示コードの正確性を保つためのものです。

コミット

commit 5b9d7825edeca72eae2fe11bf3fccb314ba23ce6
Author: Lucio De Re <lucio.dere@gmail.com>
Date:   Fri Nov 18 18:33:44 2011 -0500

    html/template, net/http, websocket: fix import paths in comments
    
    R=golang-dev
    CC=golang-dev, rsc
    https://golang.org/cl/5411048

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

https://github.com/golang/go/commit/5b9d7825edeca72eae2fe11bf3fccb314ba23ce6

元コミット内容

html/templatenet/httpwebsocket パッケージ内のコメントに記載されているインポートパスを修正しました。

変更の背景

このコミットは、Go言語の標準ライブラリにおけるパッケージの再編成と命名規則の変更に対応するためのものです。Go言語は開発初期段階において、パッケージの構造や命名が頻繁に変更されていました。特に、http パッケージが net/http に、そして template パッケージが text/templatehtml/template といったより具体的なパスに整理された時期がありました。

この変更の背景には、以下の目的があったと考えられます。

  1. 明確性の向上: http のような汎用的な名前ではなく、net/http のように net (ネットワーク関連) のサブパッケージであることを明示することで、パッケージの役割と位置付けをより明確にする。
  2. 衝突の回避: template のように一般的な名前のパッケージは、ユーザーが作成するパッケージ名と衝突する可能性がありました。text/templatehtml/template のように階層化することで、名前空間の衝突を避け、より整理された構造を提供する。
  3. 標準ライブラリの成熟: Go言語が成熟するにつれて、標準ライブラリの構造もより論理的でスケーラブルなものへと進化しました。このコミットは、その進化の過程で生じたドキュメントの不整合を修正するものです。

このコミット自体は機能的な変更ではなく、あくまで既存のコードコメント内のインポートパスを、当時の最新のパッケージ構造に合わせて更新することが目的でした。これにより、ドキュメントや例示コードが誤った情報を提供することを防ぎ、ユーザーが正しいインポートパスを使用できるようにガイドしています。

前提知識の解説

Go言語のパッケージとインポート

Go言語では、コードは「パッケージ」という単位で整理されます。パッケージは関連する機能の集合であり、他のパッケージからその機能を利用するためには import キーワードを使ってインポートする必要があります。インポートパスは、通常、Goモジュールのルートからの相対パス、または標準ライブラリの場合は特定のパスで指定されます。

例: import "fmt": 標準ライブラリの fmt パッケージをインポート import "github.com/user/repo/mypackage": 外部モジュールの mypackage をインポート

Go言語の標準ライブラリの進化

Go言語は2009年に公開され、その後も活発に開発が続けられてきました。特に初期のバージョンでは、APIの安定化やパッケージ構造の最適化のために、既存のパッケージ名やパスが変更されることがありました。これは、言語設計者がより良い構造や命名規則を見つける過程で自然に起こる現象です。

このコミットが行われた2011年頃は、Go言語がバージョン1.0のリリースに向けて安定化を進めていた時期にあたります。この時期には、以下のようなパッケージ名の変更や整理が行われました。

  • http から net/http: ネットワーク関連の機能は net パッケージの下に集約されることになり、HTTPプロトコルを扱う http パッケージは net/http に移動しました。これにより、ネットワーク関連の機能が net という一貫した名前空間の下に配置され、より論理的な構造になりました。
  • template から text/template および html/template: テンプレートエンジンに関する機能は、テキストベースのテンプレートとHTMLベースのテンプレートで明確に分離されることになりました。これにより、それぞれ text/templatehtml/template という専用のパッケージが提供され、用途に応じた適切なテンプレートエンジンを選択できるようになりました。特に html/template は、HTMLエスケープ処理を自動で行うことで、クロスサイトスクリプティング (XSS) などのセキュリティ脆弱性を防ぐ役割も担っています。

コメントの重要性

プログラミングにおいて、コメントはコードの意図、機能、使用方法などを説明するために非常に重要です。特に、例示コードを含むコメントは、そのコードを理解し、正しく使用するための手助けとなります。しかし、コード本体が変更されたにもかかわらずコメントが更新されない場合、コメントが誤った情報を提供し、ユーザーを混乱させる原因となります。このコミットは、まさにそのようなコメントの不整合を解消することを目的としています。

技術的詳細

このコミットの技術的な詳細は、Go言語のパッケージインポートパスの変更に集約されます。具体的には、以下の2つの主要な変更パターンが見られます。

  1. import "template" から import "text/template" への変更:

    • これは src/pkg/html/template/doc.go ファイルで確認できます。
    • Go言語のテンプレートパッケージは、元々 template という単一のパッケージとして提供されていました。しかし、テキスト出力用のテンプレートと、HTML出力でセキュリティ(XSS対策など)を考慮したテンプレートの2種類が必要になったため、それぞれ text/templatehtml/template に分割されました。
    • html/template パッケージのドキュメント内の例示コードでは、HTMLテンプレートを扱うにもかかわらず、古い template パッケージをインポートしている記述があったため、これを text/template に修正しています。これは、html/templatetext/template の機能を拡張しているため、基本的なテンプレート操作の例としては text/template を参照することが適切である、という意図が考えられます。
  2. import "http" から import "net/http" への変更:

    • これは src/pkg/net/http/server.gosrc/pkg/websocket/client.gosrc/pkg/websocket/server.go の各ファイルで確認できます。
    • Go言語のネットワーク関連パッケージは、初期には http のようにトップレベルに配置されていましたが、後に net という親パッケージの下に整理されました。これにより、HTTPプロトコルを扱うパッケージは net/http というフルパスでインポートされるようになりました。
    • この変更は、Goの標準ライブラリがより構造化され、ネットワーク関連の機能が net という共通の名前空間の下に集約されるという設計思想を反映しています。コメント内の例示コードも、この新しいインポートパスに合わせて更新されました。

これらの変更は、Go言語の標準ライブラリが進化し、より整理されたAPIを提供するための過程で生じたものです。コメントの修正は、この進化にドキュメントが追従し、ユーザーが常に最新かつ正確な情報にアクセスできるようにするための重要なメンテナンス作業と言えます。

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

diff --git a/src/pkg/html/template/doc.go b/src/pkg/html/template/doc.go
index 0324c9c0ee..570567e876 100644
--- a/src/pkg/html/template/doc.go
+++ b/src/pkg/html/template/doc.go
@@ -29,7 +29,7 @@ trusted, while Execute's data parameter is not. More details are provided below.
 
 Example
 
-    import "template"
+    import "text/template"
     ...
     t, err := (&template.Set{}).Parse(`{{define "T"}}Hello, {{.}}!{{end}}`)
     err = t.Execute(out, "T", "<script>alert('you have been pwned')</script>")
diff --git a/src/pkg/net/http/server.go b/src/pkg/net/http/server.go
index 7221d2508b..27040c7be5 100644
--- a/src/pkg/net/http/server.go
+++ b/src/pkg/net/http/server.go
@@ -1013,8 +1013,8 @@ func (srv *Server) Serve(l net.Listener) error {
 //	package main
 //
 //	import (
-//		"http"
 //		"io"
+//		"net/http"
 //		"log"
 //	)
 //
@@ -1044,8 +1044,8 @@ func ListenAndServe(addr string, handler Handler) error {
 // A trivial example server is:
 //
 //	import (
-//		"http"
 //		"log"
+//		"net/http"
 //	)
 //
 //	func handler(w http.ResponseWriter, req *http.Request) {
diff --git a/src/pkg/websocket/client.go b/src/pkg/websocket/client.go
index 5dfd824e6e..89cdcda71a 100644
--- a/src/pkg/websocket/client.go
+++ b/src/pkg/websocket/client.go
@@ -72,8 +72,8 @@ A trivial example client:
 	package main
 
 	import (
-\t\t"http"
 \t\t"log"
+\t\t"net/http"
 \t\t"strings"
 \t\t"websocket"
 	)
diff --git a/src/pkg/websocket/server.go b/src/pkg/websocket/server.go
index 57dc4fd1df..8320b032ea 100644
--- a/src/pkg/websocket/server.go
+++ b/src/pkg/websocket/server.go
@@ -60,8 +60,8 @@ A trivial example server:
 	package main
 
 	import (
-\t\t"http"
 \t\t"io"
+\t\t"net/http"
 \t\t"websocket"
 	)
 

コアとなるコードの解説

このコミットにおけるコードの変更は、すべてGoソースコード内のコメントブロック、特に例示コード内のインポートパスの修正に限定されています。実際のGoの実行コードやAPIの振る舞いには一切変更がありません。

  • src/pkg/html/template/doc.go:

    • このファイルは html/template パッケージのドキュメント(doc.go はGoのドキュメンテーションツール go doc が参照するファイル)です。
    • 変更箇所は、Example セクション内のインポート文です。
    • - import "template"+ import "text/template" に変更されています。これは、Goのテンプレートパッケージが text/templatehtml/template に分割されたことに伴い、基本的なテンプレートの例としては text/template をインポートするように修正されたものです。html/templatetext/template の上に構築されているため、基本的な機能を示す際には text/template を参照するのが適切と判断されたと考えられます。
  • src/pkg/net/http/server.go:

    • このファイルは net/http パッケージのHTTPサーバー実装に関連するものです。
    • 変更箇所は、ListenAndServe 関数などのドキュメンテーションコメント内の例示コードです。
    • - import ("http")+ import ("net/http") に変更されています。これは、GoのHTTPパッケージが http から net/http に移動したことに対応する修正です。これにより、コメント内の例示コードが最新の正しいインポートパスを反映するようになりました。
  • src/pkg/websocket/client.go および src/pkg/websocket/server.go:

    • これらのファイルは、GoのWebSocketパッケージのクライアントとサーバーの実装に関連するものです。
    • 変更箇所は、それぞれのファイル内の例示コードのコメントブロックです。
    • - import ("http")+ import ("net/http") に変更されています。WebSocketプロトコルはHTTPの上に構築されているため、これらの例示コードでもHTTPパッケージ(net/http)が使用されています。ここでも、HTTPパッケージのインポートパスの変更に合わせてコメントが更新されました。

これらの変更は、Go言語の標準ライブラリの進化と整理の過程で、ドキュメントの正確性を維持するために行われた、非常にクリーンな修正です。

関連リンク

参考にした情報源リンク

  • Go言語の公式ドキュメント (現在のパッケージ構造): https://pkg.go.dev/
  • Go言語の歴史と進化に関する情報 (一般的な知識として)
  • Go言語のパッケージ命名規則に関する議論 (一般的な知識として)
  • Go 1.0リリースノート (パッケージ変更の背景を理解するため)
  • Go言語の text/templatehtml/template の違いに関する情報
  • Go言語の net/http パッケージに関する情報
  • Go言語の websocket パッケージに関する情報 (このコミット時点では標準ライブラリの一部だったが、後に外部パッケージに移行)
    • Go言語のWebSocket実装は、Go 1.4で標準ライブラリから削除され、golang.org/x/net/websocket に移動しました。このコミット時点ではまだ標準ライブラリに存在していました。

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

このコミットでは、Go言語の標準ライブラリである html/templatenet/httpwebsocket パッケージ内のコメントに記載されているインポートパスが修正されています。具体的には、src/pkg/html/template/doc.gosrc/pkg/net/http/server.gosrc/pkg/websocket/client.gosrc/pkg/websocket/server.go の4つのファイルが変更されました。これらの変更は、コードの機能には影響を与えず、ドキュメントや例示コードの正確性を保つためのものです。

コミット

commit 5b9d7825edeca72eae2fe11bf3fccb314ba23ce6
Author: Lucio De Re <lucio.dere@gmail.com>
Date:   Fri Nov 18 18:33:44 2011 -0500

    html/template, net/http, websocket: fix import paths in comments
    
    R=golang-dev
    CC=golang-dev, rsc
    https://golang.org/cl/5411048

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

https://github.com/golang/go/commit/5b9d7825edeca72eae2fe11bf3fccb314ba23ce6

元コミット内容

html/templatenet/httpwebsocket パッケージ内のコメントに記載されているインポートパスを修正しました。

変更の背景

このコミットは、Go言語の標準ライブラリにおけるパッケージの再編成と命名規則の変更に対応するためのものです。Go言語は開発初期段階において、パッケージの構造や命名が頻繁に変更されていました。特に、http パッケージが net/http に、そして template パッケージが text/templatehtml/template といったより具体的なパスに整理された時期がありました。

このコミットが行われた2011年頃は、Go言語がバージョン1.0のリリースに向けて安定化を進めていた時期にあたります。この時期には、標準ライブラリのAPIが頻繁に調整されており、特にパッケージのパスや名称が変更されることがありました。例えば、2011年9月7日のr60リリースでは、net/http パッケージからURL解析機能が url パッケージに移動したり、template パッケージが新しいテンプレートパッケージ(以前は exp/template として提供されていたもの)に置き換えられたりといった変更がありました。古い template パッケージは old/template に移動され、非推奨とされました。

この変更の背景には、以下の目的があったと考えられます。

  1. 明確性の向上: http のような汎用的な名前ではなく、net/http のように net (ネットワーク関連) のサブパッケージであることを明示することで、パッケージの役割と位置付けをより明確にする。
  2. 衝突の回避: template のように一般的な名前のパッケージは、ユーザーが作成するパッケージ名と衝突する可能性がありました。text/templatehtml/template のように階層化することで、名前空間の衝突を避け、より整理された構造を提供する。
  3. 標準ライブラリの成熟: Go言語が成熟するにつれて、標準ライブラリの構造もより論理的でスケーラブルなものへと進化しました。このコミットは、その進化の過程で生じたドキュメントの不整合を修正するものです。
  4. gofix ツールの活用: Go言語の開発チームは、このようなAPI変更に伴うユーザーコードの移行を支援するため、gofix というツールを提供していました。このツールは、古いAPIの使用箇所を自動的に新しいAPIに書き換える機能を持っていました。しかし、コメント内の例示コードは gofix の対象外となるため、手動での修正が必要でした。

このコミット自体は機能的な変更ではなく、あくまで既存のコードコメント内のインポートパスを、当時の最新のパッケージ構造に合わせて更新することが目的でした。これにより、ドキュメントや例示コードが誤った情報を提供することを防ぎ、ユーザーが正しいインポートパスを使用できるようにガイドしています。

前提知識の解説

Go言語のパッケージとインポート

Go言語では、コードは「パッケージ」という単位で整理されます。パッケージは関連する機能の集合であり、他のパッケージからその機能を利用するためには import キーワードを使ってインポートする必要があります。インポートパスは、通常、Goモジュールのルートからの相対パス、または標準ライブラリの場合は特定のパスで指定されます。

例: import "fmt": 標準ライブラリの fmt パッケージをインポート import "github.com/user/repo/mypackage": 外部モジュールの mypackage をインポート

Go言語の標準ライブラリの進化とAPI変更

Go言語は2009年に公開され、その後も活発に開発が続けられてきました。特に初期のバージョンでは、APIの安定化やパッケージ構造の最適化のために、既存のパッケージ名やパスが変更されることがありました。これは、言語設計者がより良い構造や命名規則を見つける過程で自然に起こる現象です。

このコミットが行われた2011年頃は、Go言語がバージョン1.0のリリースに向けて安定化を進めていた時期にあたります。この時期には、以下のようなパッケージ名の変更や整理が行われました。

  • http から net/http: ネットワーク関連の機能は net パッケージの下に集約されることになり、HTTPプロトコルを扱う http パッケージは net/http に移動しました。これにより、ネットワーク関連の機能が net という一貫した名前空間の下に配置され、より論理的な構造になりました。
  • template から text/template および html/template: テンプレートエンジンに関する機能は、テキストベースのテンプレートとHTMLベースのテンプレートで明確に分離されることになりました。これにより、それぞれ text/templatehtml/template という専用のパッケージが提供され、用途に応じた適切なテンプレートエンジンを選択できるようになりました。特に html/template は、HTMLエスケープ処理を自動で行うことで、クロスサイトスクリプティング (XSS) などのセキュリティ脆弱性を防ぐ役割も担っています。2011年9月のr60リリースでは、古い template パッケージが old/template に移動され、新しいテンプレートパッケージ(現在の text/template に相当)が導入されました。

gofix ツールの役割

Go言語の初期開発段階では、APIの変更が頻繁に行われたため、既存のコードを新しいAPIに自動的に移行するための gofix というツールが提供されました。このツールは、Goのソースコードを解析し、非推奨となった関数呼び出しやパッケージパスなどを自動的に修正する機能を持っていました。これにより、開発者はAPIの変更に迅速に対応し、コードベースを最新の状態に保つことができました。しかし、コメント内の例示コードは gofix の自動修正の対象外であったため、手動での修正が必要でした。

コメントの重要性

プログラミングにおいて、コメントはコードの意図、機能、使用方法などを説明するために非常に重要です。特に、例示コードを含むコメントは、そのコードを理解し、正しく使用するための手助けとなります。しかし、コード本体が変更されたにもかかわらずコメントが更新されない場合、コメントが誤った情報を提供し、ユーザーを混乱させる原因となります。このコミットは、まさにそのようなコメントの不整合を解消することを目的としています。

技術的詳細

このコミットの技術的な詳細は、Go言語のパッケージインポートパスの変更に集約されます。具体的には、以下の2つの主要な変更パターンが見られます。

  1. import "template" から import "text/template" への変更:

    • これは src/pkg/html/template/doc.go ファイルで確認できます。
    • Go言語のテンプレートパッケージは、元々 template という単一のパッケージとして提供されていました。しかし、テキスト出力用のテンプレートと、HTML出力でセキュリティ(XSS対策など)を考慮したテンプレートの2種類が必要になったため、それぞれ text/templatehtml/template に分割されました。
    • html/template パッケージのドキュメント内の例示コードでは、HTMLテンプレートを扱うにもかかわらず、古い template パッケージをインポートしている記述があったため、これを text/template に修正しています。これは、html/templatetext/template の機能を拡張しているため、基本的なテンプレート操作の例としては text/template を参照することが適切である、という意図が考えられます。
  2. import "http" から import "net/http" への変更:

    • これは src/pkg/net/http/server.gosrc/pkg/websocket/client.gosrc/pkg/websocket/server.go の各ファイルで確認できます。
    • Go言語のネットワーク関連パッケージは、初期には http のようにトップレベルに配置されていましたが、後に net という親パッケージの下に整理されました。これにより、HTTPプロトコルを扱うパッケージは net/http というフルパスでインポートされるようになりました。
    • この変更は、Goの標準ライブラリがより構造化され、ネットワーク関連の機能が net という共通の名前空間の下に集約されるという設計思想を反映しています。コメント内の例示コードも、この新しいインポートパスに合わせて更新されました。

これらの変更は、Go言語の標準ライブラリが進化し、より整理されたAPIを提供するための過程で生じたものです。コメントの修正は、この進化にドキュメントが追従し、ユーザーが常に最新かつ正確な情報にアクセスできるようにするための重要なメンテナンス作業と言えます。

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

diff --git a/src/pkg/html/template/doc.go b/src/pkg/html/template/doc.go
index 0324c9c0ee..570567e876 100644
--- a/src/pkg/html/template/doc.go
+++ b/src/pkg/html/template/doc.go
@@ -29,7 +29,7 @@ trusted, while Execute's data parameter is not. More details are provided below.
 
 Example
 
-    import "template"
+    import "text/template"
     ...
     t, err := (&template.Set{}).Parse(`{{define "T"}}Hello, {{.}}!{{end}}`)
     err = t.Execute(out, "T", "<script>alert('you have been pwned')</script>")
diff --git a/src/pkg/net/http/server.go b/src/pkg/net/http/server.go
index 7221d2508b..27040c7be5 100644
--- a/src/pkg/net/http/server.go
+++ b/src/pkg/net/http/server.go
@@ -1013,8 +1013,8 @@ func (srv *Server) Serve(l net.Listener) error {
 //	package main
 //
 //	import (
-//		"http"
 //		"io"
+//		"net/http"
 //		"log"
 //	)
 //
@@ -1044,8 +1044,8 @@ func ListenAndServe(addr string, handler Handler) error {
 // A trivial example server is:
 //
 //	import (
-//		"http"
 //		"log"
+//		"net/http"
 //	)
 //
 //	func handler(w http.ResponseWriter, req *http.Request) {
diff --git a/src/pkg/websocket/client.go b/src/pkg/websocket/client.go
index 5dfd824e6e..89cdcda71a 100644
--- a/src/pkg/websocket/client.go
+++ b/src/pkg/websocket/client.go
@@ -72,8 +72,8 @@ A trivial example client:
 	package main
 
 	import (
-\t\t"http"
 \t\t"log"
+\t\t"net/http"
 \t\t"strings"
 \t\t"websocket"
 	)
diff --git a/src/pkg/websocket/server.go b/src/pkg/websocket/server.go
index 57dc4fd1df..8320b032ea 100644
--- a/src/pkg/websocket/server.go
+++ b/src/pkg/websocket/server.go
@@ -60,8 +60,8 @@ A trivial example server:
 	package main
 
 	import (
-\t\t"http"
 \t\t"io"
+\t\t"net/http"
 \t\t"websocket"
 	)
 

コアとなるコードの解説

このコミットにおけるコードの変更は、すべてGoソースコード内のコメントブロック、特に例示コード内のインポートパスの修正に限定されています。実際のGoの実行コードやAPIの振る舞いには一切変更がありません。

  • src/pkg/html/template/doc.go:

    • このファイルは html/template パッケージのドキュメント(doc.go はGoのドキュメンテーションツール go doc が参照するファイル)です。
    • 変更箇所は、Example セクション内のインポート文です。
    • - import "template"+ import "text/template" に変更されています。これは、Goのテンプレートパッケージが text/templatehtml/template に分割されたことに伴い、基本的なテンプレートの例としては text/template をインポートするように修正されたものです。html/templatetext/template の上に構築されているため、基本的な機能を示す際には text/template を参照するのが適切と判断されたと考えられます。
  • src/pkg/net/http/server.go:

    • このファイルは net/http パッケージのHTTPサーバー実装に関連するものです。
    • 変更箇所は、ListenAndServe 関数などのドキュメンテーションコメント内の例示コードです。
    • - import ("http")+ import ("net/http") に変更されています。これは、GoのHTTPパッケージが http から net/http に移動したことに対応する修正です。これにより、コメント内の例示コードが最新の正しいインポートパスを反映するようになりました。
  • src/pkg/websocket/client.go および src/pkg/websocket/server.go:

    • これらのファイルは、GoのWebSocketパッケージのクライアントとサーバーの実装に関連するものです。
    • 変更箇所は、それぞれのファイル内の例示コードのコメントブロックです。
    • - import ("http")+ import ("net/http") に変更されています。WebSocketプロトコルはHTTPの上に構築されているため、これらの例示コードでもHTTPパッケージ(net/http)が使用されています。ここでも、HTTPパッケージのインポートパスの変更に合わせてコメントが更新されました。

これらの変更は、Go言語の標準ライブラリの進化と整理の過程で、ドキュメントの正確性を維持するために行われた、非常にクリーンな修正です。

関連リンク

参考にした情報源リンク

  • Go言語の公式ドキュメント (現在のパッケージ構造): https://pkg.go.dev/
  • Go言語の歴史と進化に関する情報 (一般的な知識として)
  • Go言語のパッケージ命名規則に関する議論 (一般的な知識として)
  • Go 1.0リリースノート (パッケージ変更の背景を理解するため)
  • Go言語の text/templatehtml/template の違いに関する情報
  • Go言語の net/http パッケージに関する情報
  • Go言語の websocket パッケージに関する情報 (このコミット時点では標準ライブラリの一部だったが、後に外部パッケージに移行)
    • Go言語のWebSocket実装は、Go 1.4で標準ライブラリから削除され、golang.org/x/net/websocket に移動しました。このコミット時点ではまだ標準ライブラリに存在していました。
  • Go言語のr60リリースに関する情報 (2011年9月7日)
    • Go r60 release notes (Web検索結果から参照)
  • gofix ツールに関する情報 (Web検索結果から参照)