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

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

このコミットは、Go言語の公式ドキュメントである doc/go1.html および doc/go1.tmpl ファイルに対する変更を記録しています。具体的には、Go 1リリースにおけるテンプレートパッケージ(text/template および html/template)の変更点に関する説明が追加・更新されています。

コミット

commit 1cd272d16ae59236ab63f9d8e55db98f3c5b80ee
Author: Rob Pike <r@golang.org>
Date:   Thu Mar 8 17:15:23 2012 +1100

    doc/go1: template packages have changed since r60
    
    R=golang-dev, adg
    CC=golang-dev
    https://golang.org/cl/5787049

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

https://github.com/golang/go/commit/1cd272d16ae59236ab63f9d8e55db98f3c5b80ee

元コミット内容

doc/go1: template packages have changed since r60
    
R=golang-dev, adg
CC=golang-dev
https://golang.org/cl/5787049

変更の背景

このコミットは、Go言語がバージョン1(Go 1)として安定版をリリースする準備段階で行われたドキュメントの更新の一部です。Go 1は、Go言語の安定性と互換性を保証するための重要なマイルストーンであり、それまでの開発版(r60など)から多くのAPI変更や改善が加えられました。

特に、テンプレートパッケージはGo 1で大幅な再設計が行われました。以前は template および exp/template/html といったパッケージ名で提供されていましたが、Go 1ではそれぞれ text/templatehtml/template に移動し、インターフェースも簡素化されました。この変更は、テンプレートの利用方法をより直感的で強力なものにするためのものでしたが、既存のコードベースに影響を与える可能性がありました。

そのため、Go 1のリリースノートや移行ガイドとなる doc/go1.html に、これらのテンプレートパッケージの変更点を明確に記述し、開発者が既存のコードをGo 1に移行する際の助けとすることが目的でした。

前提知識の解説

  • Go 1: Go言語の最初の安定版リリース。このリリース以降、Go言語は後方互換性を厳密に維持することを約束しました。Go 1以前のバージョンでは、APIの破壊的変更が頻繁に行われていました。
  • Go言語のテンプレートパッケージ: Go言語には、HTMLやテキストなどの動的なコンテンツを生成するための組み込みテンプレートエンジンがあります。主に text/templatehtml/template の2つのパッケージが存在します。
    • text/template: 任意のテキスト形式の出力を生成するための汎用テンプレートエンジン。
    • html/template: HTML出力を安全に生成するためのテンプレートエンジン。クロスサイトスクリプティング(XSS)攻撃を防ぐための自動エスケープ機能が組み込まれています。
  • テンプレートセット (Template Set): Go 1以前のテンプレートパッケージに存在した概念で、複数のテンプレートをグループ化して管理するための仕組みでした。これにより、共通の関数や変数を共有したり、名前でテンプレートを呼び出したりすることができました。しかし、この概念はGo 1で廃止され、Template オブジェクト自体が複数の名前付きテンプレート定義を持つように変更されました。
  • go fix ツール: Go言語に付属するツールで、Goのバージョンアップに伴うAPIの変更や非推奨になった機能の使用箇所を自動的に修正する機能を提供します。ただし、すべての変更を自動で修正できるわけではありません。

技術的詳細

このコミットで追加されたドキュメントの内容は、Go 1におけるテンプレートパッケージの主要な変更点を以下の3つの側面から説明しています。

  1. パッケージの移動:

    • 旧: template および exp/template/html
    • 新: text/template および html/template この変更は、パッケージの役割をより明確にし、標準ライブラリの構造を整理することを目的としています。exp (experimental) プレフィックスが削除されたことは、これらのパッケージが安定版として提供されることを意味します。
  2. インターフェースの簡素化と「テンプレートセット」の廃止: Go 1以前のテンプレートパッケージでは、「テンプレートセット」という概念があり、複数のテンプレートをまとめて管理していました。しかし、Go 1ではこの概念が廃止され、Template オブジェクト自体が複数の名前付きテンプレート定義を持つようになりました。これにより、Template オブジェクトは事実上、テンプレート呼び出しのための名前空間を構築します。

    • 変更前: 複数のテンプレートを template.Set のような構造で管理し、セット内のテンプレートを呼び出す。
    • 変更後: 単一の Template オブジェクトが、ParseParseFilesParseGlob などのメソッドを通じて複数の名前付きテンプレートを内部に保持する。これにより、{{template "name"}} のように、その Template オブジェクトに関連付けられた任意のテンプレートを呼び出すことができるようになります。 この変更により、多くの関数やメソッドが不要となり、インターフェースが大幅に簡素化されました。
  3. 移行ガイドライン:

    • go fix ツールによるインポートパスの自動更新: go fix ツールは、旧パッケージのインポートパス(例: import "template")を新パッケージのインポートパス(例: import "text/template")に自動的に修正します。これにより、単純なインポートパスの変更は手動で行う必要がなくなります。
    • 複数テンプレートを使用するコードの手動更新: go fix ツールはインポートパスの変更は行いますが、テンプレートセットの廃止に伴うロジックの変更は自動では行えません。そのため、複数のテンプレートを連携して使用している既存のコードは、Go 1の新しいインターフェースに合わせて手動で更新する必要があります。ドキュメントでは、text/template の例を参照して更新を行うよう促しています。

これらの変更は、Go言語のテンプレートシステムをより堅牢で使いやすくするための重要なステップでした。特に、HTMLテンプレートにおける自動エスケープ機能は、Webアプリケーション開発におけるセキュリティを大幅に向上させました。

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

このコミットは、Go言語のドキュメントファイルである doc/go1.htmldoc/go1.tmpl のみを変更しています。実際のGo言語のソースコード(テンプレートパッケージの実装)自体は変更していません。

変更の核心は、doc/go1.html および doc/go1.tmpl に以下の新しいセクションが追加されたことです。

+<h3 id=\"templates\">The template packages</h3>
+
+<p>
+The <code>template</code> and <code>exp/template/html</code> packages have moved to 
+<a href=\"/pkg/text/template/\"><code>text/template</code></a> and
+<a href=\"/pkg/html/template/\"><code>html/template</code></a>.
+More significant, the interface to these packages has been simplified.
+The template language is the same, but the concept of \"template set\" is gone
+and the functions and methods of the packages have changed accordingly,
+often by elimination.
+</p>
+
+<p>
+Instead of sets, a <code>Template</code> object
+may contain multiple named template definitions,
+in effect constructing
+name spaces for template invocation.
+A template can invoke any other template associated with it, but only those
+templates associated with it.
+The simplest way to associate templates is to parse them together, something
+made easier with the new structure of the packages.
+</p>
+
+<p>
+<em>Updating</em>:
+The imports will be updated by fix tool.
+Single-template uses will be otherwise be largely unaffected.
+Code that uses multiple templates in concert will need to be updated by hand.
+The <a href=\"/pkg/text/template/#examples\">examples</a> in
+the documentation for <code>text/template</code> can provide guidance.
+</p>

この追加により、Go 1のリリースノートにテンプレートパッケージの変更に関する公式な説明が組み込まれました。

コアとなるコードの解説

前述の通り、このコミット自体はGo言語のテンプレートパッケージの実装コードを変更するものではなく、Go 1のリリースに伴うドキュメントの更新です。したがって、解説すべき「コアとなるコード」は、追加されたドキュメントのテキスト内容そのものになります。

追加されたドキュメントは、Go 1で導入されたテンプレートパッケージの変更点を簡潔かつ明確に説明しています。

  • パッケージ名の変更: templateexp/template/html がそれぞれ text/templatehtml/template になったことを明記しています。これは、パッケージの役割と安定性を示す重要な変更です。
  • インターフェースの簡素化: 最も重要な変更点として、「テンプレートセット」の概念が廃止され、Template オブジェクト自体が複数の名前付きテンプレート定義を持つようになったことが強調されています。これにより、テンプレートの管理と呼び出しがより直接的になりました。
  • 移行の指針: go fix ツールがインポートパスの変更を自動で行うこと、そして複数のテンプレートを連携して使用している場合は手動での更新が必要であること、さらに text/template のドキュメント例が参考になることが示されています。これは、開発者がGo 1への移行をスムーズに行うための実用的な情報です。

このドキュメントの追加は、Go 1のリリースにおける重要な情報提供の一環であり、開発者が新しいAPIに適応するための手助けとなることを目的としています。

関連リンク

参考にした情報源リンク

  • Go言語の公式ドキュメント
  • Go言語のGitHubリポジトリ
  • Go言語のコミュニティフォーラムやブログ記事 (Go 1リリース時の情報)
  • go fix コマンドに関する公式ドキュメント
  • text/template および html/template パッケージの公式ドキュメント
  • Go言語の歴史に関する情報