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

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

このコミットは、Go言語の標準ライブラリであるtext/templateパッケージに比較関数が追加されたことを、Go 1.2のリリースノートに追記するものです。具体的には、doc/go1.2.txtファイルにtext/template: add comparison functions (CL 13091045).という記述が1行追加されています。これは、Go 1.2の変更点として、テンプレートエンジンにおける比較操作のサポートが強化されたことを示しています。

コミット

  • コミットハッシュ: a83b17c0b741263e7f3ad5ebb2e3aba27751c770
  • 作者: Rob Pike r@golang.org
  • コミット日時: 2013年8月21日 水曜日 12:55:09 +1000

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

https://github.com/golang/go/commit/a83b17c0b741263e7f3ad5ebb2e3aba27751c770

元コミット内容

doc/go1.2.txt: text/template: add comparison functions

R=golang-dev, dsymonds
CC=golang-dev
https://golang.org/cl/12801045

変更の背景

このコミット自体はドキュメントの更新ですが、その背景にはGo言語のテンプレートパッケージであるtext/templateおよびhtml/templateに比較関数が追加されたという重要な機能変更があります。

Goのテンプレートエンジンは、データの表示や整形に非常に強力ですが、以前のバージョンではテンプレート内で直接的な値の比較を行うための組み込み関数がありませんでした。例えば、if文で数値や文字列の等価性をチェックしたい場合、カスタム関数を登録するか、テンプレートの外部で事前に比較結果を計算して渡す必要がありました。これは、テンプレートの記述を複雑にし、開発者の負担を増やす要因となっていました。

この不便さを解消し、より表現力豊かで簡潔なテンプレート記述を可能にするために、eq (equal), ne (not equal), lt (less than), le (less than or equal), gt (greater than), ge (greater than or equal) といった比較関数が追加されました。これにより、テンプレート内で直接的に条件分岐を行うことが容易になり、Goのテンプレートエンジンの利便性が大幅に向上しました。

前提知識の解説

Go言語のtext/templateおよびhtml/templateパッケージ

Go言語には、テキストベースの出力を生成するためのtext/templateパッケージと、HTML出力を安全に生成するためのhtml/templateパッケージがあります。これらは非常に似たインターフェースを持ち、テンプレートの構文も共通しています。

  • text/template: 任意のテキスト形式の出力を生成するために使用されます。設定ファイル、コード生成、プレーンテキストのレポートなど、HTML以外の用途に適しています。
  • html/template: text/templateの機能に加え、HTMLの自動エスケープ機能を提供します。これにより、クロスサイトスクリプティング(XSS)攻撃などのセキュリティ脆弱性を防ぎながら、安全にWebページを生成できます。

両パッケージは、テンプレート内でデータ構造のフィールドにアクセスしたり、パイプライン(|)を使って関数を連結したり、条件分岐({{if .}}...{{end}})や繰り返し({{range .}}...{{end}})を行ったりする機能を提供します。

テンプレート関数

Goのテンプレートパッケージでは、テンプレート内で呼び出すことができる「関数」を定義し、登録することができます。これらの関数は、テンプレートに渡されたデータを加工したり、特定のロジックを実行したりするために使用されます。例えば、文字列を大文字に変換する関数や、日付を特定のフォーマットで表示する関数などが考えられます。

比較関数が追加される前は、テンプレート内でif文を使う場合、ブール値の変数に依存するか、カスタム関数で比較ロジックを実装する必要がありました。新しい比較関数は、これらの一般的な比較操作を組み込み関数として提供することで、テンプレートの記述をより直感的かつ簡潔にしました。

技術的詳細

text/templateおよびhtml/templateに追加された比較関数は、以下の通りです。

  • eq (equal): 2つの値が等しい場合にtrueを返します。
  • ne (not equal): 2つの値が等しくない場合にtrueを返します。
  • lt (less than): 最初の値が2番目の値より小さい場合にtrueを返します。
  • le (less than or equal): 最初の値が2番目の値以下の場合にtrueを返します。
  • gt (greater than): 最初の値が2番目の値より大きい場合にtrueを返します。
  • ge (greater than or equal): 最初の値が2番目の値以上の場合にtrueを返します。

これらの関数は、ブール値、整数(符号付きおよび符号なし)、浮動小数点数、複素数、文字列など、Goの基本的な型に対して機能します。これにより、テンプレート内で様々な種類のデータを柔軟に比較できるようになりました。

使用例:

package main

import (
	"os"
	"text/template"
)

func main() {
	tmpl, err := template.New("example").Parse(`
{{if eq .Value1 .Value2}}
Value1 と Value2 は等しいです。
{{else}}
Value1 と Value2 は異なります。
{{end}}

{{if gt .Age 18}}
あなたは成人です。
{{else}}
あなたは未成年です。
{{end}}

{{if and (gt .Score 80) (le .Score 100)}}
素晴らしいスコアです!
{{end}}
`)
	if err != nil {
		panic(err)
	}

	data := struct {
		Value1 int
		Value2 int
		Age    int
		Score  int
	}{
		Value1: 10,
		Value2: 10,
		Age:    25,
		Score:  95,
	}

	err = tmpl.Execute(os.Stdout, data)
	if err != nil {
		panic(err)
	}
}

上記の例では、eq関数を使ってValue1Value2の等価性をチェックし、gt関数を使ってAgeが18より大きいかをチェックしています。また、and関数と組み合わせて複数の条件を評価することも可能です。

これらの比較関数は、テンプレートの可読性と表現力を向上させ、より複雑なロジックをテンプレート内で直接処理できるようにすることで、Goアプリケーション開発の効率を高めました。

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

このコミット自体は、Go 1.2のリリースノートを記述したドキュメントファイルdoc/go1.2.txtの変更のみです。

--- a/doc/go1.2.txt
+++ b/doc/go1.2.txt
@@ -69,6 +69,7 @@ sync/atomic: add Swap functions (CL 12670045).
 syscall: implemented Sendfile for Darwin, added Syscall9 for Darwin/amd64 (CL 10980043).
 testing: AllocsPerRun is now quantized to an integer (the type is still float64) (CL 9837049).
 testing: add TB interface (intersection of T and B's methods) (CL 12962043).
+text/template: add comparison functions (CL 13091045).
 time: Allow Parse and Format to handle time zone offsets with seconds (CL 8132044)
 time: patterns require non-lowercase letter to follow Mon, Jan etc (CL 12448044).
 unicode: add In, a nicer-to-use but equivalent version of IsOneOf (CL 11672044).

具体的には、69行目の後にtext/template: add comparison functions (CL 13091045).という1行が追加されています。

コアとなるコードの解説

doc/go1.2.txtファイルは、Go言語のバージョン1.2における主要な変更点や新機能、改善点などをまとめたリリースノートの草稿または最終版です。Goの各リリースでは、このようなドキュメントが作成され、ユーザーが新しいバージョンで何が変更されたかを把握できるように提供されます。

このコミットでdoc/go1.2.txtに1行追加されたことは、text/templateパッケージへの比較関数の追加が、Go 1.2の重要な変更点の一つとして公式に認識され、ユーザーに周知されるべき情報であると判断されたことを意味します。CL 13091045という表記は、この機能追加がGoのコードレビューシステムであるGerritにおける変更リスト(Change List)のIDであることを示しています。このIDを追跡することで、実際のコード変更内容や議論の経緯を詳細に確認することができます。

したがって、このコミット自体は機能追加のコードではなく、その機能追加を公式ドキュメントに反映させるためのコミットであり、Goプロジェクトにおけるドキュメンテーションの重要性を示しています。

関連リンク

参考にした情報源リンク