[インデックス 12200] ファイルの概要
このコミットは、Go言語の公式コードラボである「Go Wiki」のドキュメントとサンプルコードを、Go 1のリリースに合わせて更新するものです。主な変更点は、パッケージ名の変更(http
からnet/http
、template
からhtml/template
)、ビルドプロセスの簡素化(8g
/8l
からgo build
への移行)、およびドキュメント内の関連情報の更新です。
コミット
- コミットハッシュ:
52cd4c8610561bfe0ba06ecb6dbb540128ffc7e8
- 作者: Shenghou Ma minux.ma@gmail.com
- コミット日時: Sat Feb 25 01:09:05 2012 +0800
- 変更ファイル数: 9ファイル
- 変更行数: 108行挿入, 129行削除
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/52cd4c8610561bfe0ba06ecb6dbb540128ffc7e8
元コミット内容
doc: update codelab/wiki to Go 1.
R=golang-dev, r, adg
CC=golang-dev
https://golang.org/cl/5683076
変更の背景
このコミットは、Go言語のバージョン1(Go 1)のリリースに伴う、標準ライブラリの変更とビルドツールの進化に対応するために行われました。Go 1は、Go言語の安定した最初のメジャーリリースであり、将来の互換性を保証するための重要なマイルストーンでした。このリリースでは、一部のパッケージが再編成され、より明確な役割を持つように変更されました。特に、Webアプリケーション開発に関連するhttp
パッケージとtemplate
パッケージは、その機能とセキュリティの側面から再設計されました。
また、Go 1では、従来のアーキテクチャ固有のコンパイラ(例: 8g
、6g
)とリンカ(例: 8l
、6l
)に代わり、統一されたgo build
コマンドが導入され、ビルドプロセスが大幅に簡素化されました。これにより、開発者はより簡単にGoプログラムをビルドできるようになりました。
このコミットの目的は、Go Wikiのコードラボが最新のGo 1の仕様に準拠し、読者が混乱することなく学習を進められるようにすることです。
前提知識の解説
Go 1のリリースと互換性
Go 1は、Go言語の設計と実装における重要な転換点でした。このリリース以降、Goチームは「Go 1の互換性保証」を掲げ、Go 1で書かれたプログラムは将来のGoのバージョンでも動作することを約束しました。これにより、Go言語はエンタープライズレベルのアプリケーション開発においても信頼性の高い選択肢となりました。
http
パッケージからnet/http
パッケージへの変更
Go 1以前は、HTTPクライアントとサーバーの機能はhttp
というトップレベルのパッケージで提供されていました。Go 1では、ネットワーク関連の機能がnet
パッケージの下に集約され、HTTP機能はnet/http
というサブパッケージに移動されました。これは、標準ライブラリの構造をより論理的かつ整理されたものにするための変更です。
template
パッケージからhtml/template
とtext/template
への分割
Go 1以前のtemplate
パッケージは、テキストとHTMLの両方のテンプレート処理を扱っていました。しかし、HTMLテンプレートを扱う際には、クロスサイトスクリプティング(XSS)攻撃を防ぐための特別な注意が必要です。Go 1では、この懸念に対処するため、template
パッケージがtext/template
とhtml/template
の2つに分割されました。
text/template
: あらゆる種類のテキスト出力を生成するための汎用テンプレートエンジンです。セキュリティ上の考慮は行われません。html/template
: HTML出力を生成するために特別に設計されたテンプレートエンジンです。自動エスケープ機能が組み込まれており、テンプレートに挿入されるデータがHTMLコンテキストで安全であることを保証し、XSS攻撃のリスクを軽減します。WebアプリケーションでHTMLを生成する際には、常にhtml/template
を使用することが推奨されます。
Goのビルドシステム(旧来の8g
/8l
とgo build
)
Go 1以前のGoのビルドプロセスは、Unix系のシステムでC言語のコンパイラやリンカに似たツールチェーンを使用していました。例えば、32ビットIntelアーキテクチャ(GOARCH=386
)の場合、コンパイラは8g
、リンカは8l
でした。64ビットIntelアーキテクチャ(GOARCH=amd64
)の場合は6g
と6l
が使用されました。これらのコマンドは、特定のアーキテクチャとOSに依存しており、開発者が手動で適切なコマンドを選択する必要がありました。
Go 1では、go build
という統一されたコマンドが導入されました。このコマンドは、ソースファイルを自動的に検出し、適切なコンパイラとリンカを呼び出して実行可能ファイルを生成します。これにより、ビルドプロセスが大幅に簡素化され、クロスプラットフォーム開発が容易になりました。go build
は、Goモジュールシステムと密接に連携し、依存関係の解決とビルドを自動的に行います。
技術的詳細
このコミットにおける技術的な変更は、Go 1のリリースによってもたらされた標準ライブラリとツールチェーンの進化を直接反映しています。
-
パッケージの再編成とセキュリティ強化:
http
からnet/http
への変更は、Goの標準ライブラリがよりモジュール化され、ネットワーク関連の機能がnet
パッケージの下に一元化されたことを示しています。これにより、開発者は関連する機能をより簡単に見つけ、利用できるようになります。template
からhtml/template
への移行は、Webアプリケーションのセキュリティを向上させるための重要なステップです。html/template
は、デフォルトでHTMLエスケープを実行するため、開発者が明示的にエスケープ処理を記述しなくても、XSS脆弱性を防ぐことができます。これは、Webアプリケーション開発におけるベストプラクティスをGo言語が標準でサポートすることを示しています。
-
ビルドプロセスの簡素化:
Makefile
からのMake.inc
とMake.common
の削除、および8g
/8l
コマンドからgo build
への置き換えは、Goのビルドシステムが大きく進化したことを意味します。go build
コマンドは、Goのソースコードをコンパイルし、リンクして実行可能ファイルを生成する際の標準的な方法となりました。これにより、開発者はプラットフォームやアーキテクチャの違いを意識することなく、同じコマンドでビルドを実行できるようになり、開発ワークフローが大幅に効率化されました。Makefile
におけるCLEANFILES
の定義が+=
から:=
に変更されたのは、Makefileの変数の評価タイミングに関する細かな調整です。:=
は即時評価を意味し、変数が定義された時点で値が確定します。これは、ビルドシステムの堅牢性を高めるための変更と考えられます。
-
ドキュメントの正確性向上:
- HTMLドキュメント内のGoのインストール要件(サポートOS)やコマンドラインの例が更新されたことで、読者は最新かつ正確な情報に基づいてGo Wikiのコードラボを進めることができます。特に、Windows環境での実行方法が明記されたことは、より多くのユーザーがコードラボを試す上で役立ちます。
template.ParseFiles
の引数からnil
が削除されたのは、html/template
パッケージのAPI変更によるものです。Go 1では、ParseFiles
関数は可変長引数を受け取るようになり、以前のバージョンで必要だったnil
の引数は不要になりました。
これらの変更は、Go 1が単なるバージョンアップではなく、Go言語のエコシステム全体を成熟させ、より使いやすく、安全なものにするための包括的な取り組みの一環であったことを示しています。
コアとなるコードの変更箇所
doc/codelab/wiki/Makefile
--- a/doc/codelab/wiki/Makefile
+++ b/doc/codelab/wiki/Makefile
@@ -2,13 +2,9 @@
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file.
-include ../../../src/Make.inc
-
all: index.html
-include ../../../src/Make.common
-
-CLEANFILES+=srcextract.bin htmlify.bin get.bin
+CLEANFILES:=srcextract.bin htmlify.bin get.bin
index.html: wiki.html srcextract.bin htmlify.bin
PATH=.:$$PATH awk '/^!/{system(substr($$0,2)); next} {print}' < wiki.html | tr -d '\r' > index.html
@@ -17,9 +13,8 @@ test: get.bin
bash ./test.sh
rm -f get.6 get.bin
-%.bin: %.$O
- $(LD) -o $@ $<\n-\n-%.$O: %.go
- $(GC) $(GCFLAGS) $(GCIMPORTS) $*.go
+%.bin: %.go
+ go build -o $@ $^
+clean:
+ rm -f $(CLEANFILES)
Goソースファイル (doc/codelab/wiki/final-noclosure.go
など)
--- a/doc/codelab/wiki/final-noclosure.go
+++ b/doc/codelab/wiki/final-noclosure.go
@@ -6,10 +6,10 @@ package main
import (
"errors"
+ "html/template"
"io/ioutil"
"net/http"
"regexp"
- "text/template"
)
type Page struct {
Goソースファイル (doc/codelab/wiki/final-parsetemplate.go
など)
--- a/doc/codelab/wiki/final-parsetemplate.go
+++ b/doc/codelab/wiki/final-parsetemplate.go
@@ -59,7 +59,7 @@ func saveHandler(w http.ResponseWriter, r *http.Request, title string) {
}
func renderTemplate(w http.ResponseWriter, tmpl string, p *Page) {
- t, err := template.ParseFiles(tmpl+".html", nil)
+ t, err := template.ParseFiles(tmpl + ".html")
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
HTMLドキュメントファイル (doc/codelab/wiki/index.html
, doc/codelab/wiki/wiki.html
)
--- a/doc/codelab/wiki/index.html
+++ b/doc/codelab/wiki/index.html
@@ -6,8 +6,8 @@ Covered in this codelab:
</p>
<ul>
<li>Creating a data structure with load and save methods</li>
-<li>Using the <code>http</code> package to build web applications
-<li>Using the <code>template</code> package to process HTML templates</li>
+<li>Using the <code>net/http</code> package to build web applications
+<li>Using the <code>html/template</code> package to process HTML templates</li>
<li>Using the <code>regexp</code> package to validate user input</li>
<li>Using closures</li>
</ul>
@@ -210,23 +204,21 @@ You can compile and run the program like this:
</p>
<pre>
-$ 8g wiki.go
-$ 8l wiki.8
-$ ./8.out
+$ go build wiki.go
+$ ./wiki
This is a sample page.
</pre>
<p>
-(The <code>8g</code> and <code>8l</code> commands are applicable to
-<code>GOARCH=386</code>. If you're on an <code>amd64</code> system,
-substitute 6's for the 8's.)
+(If you're using Windows you must type "<code>wiki</code>" without the
+"<code>./</code>" to run the program.)
</p>
<p>
<a href="part1.go">Click here to view the code we've written so far.</a>
</p>
-<h2>Introducing the <code>http</code> package (an interlude)</h2>
+<h2>Introducing the <code>net/http</code> package (an interlude)</h2>
コアとなるコードの解説
Makefile
の変更
- ビルドコマンドの変更: 従来のGoのビルドシステムで使用されていた
Make.inc
やMake.common
といったインクルードファイルが削除され、%.bin: %.go
というルールでgo build -o $@ $^
が使用されるようになりました。これは、Go 1で導入されたgo build
コマンドへの移行を意味します。go build
は、Goのソースファイルをコンパイルし、リンクして実行可能ファイルを生成する標準的な方法であり、従来のアーキテクチャ固有のコンパイラ(8g
/6g
)やリンカ(8l
/6l
)の使用を不要にしました。 CLEANFILES
の定義:CLEANFILES+=...
からCLEANFILES:=...
への変更は、Makefileの変数の評価タイミングを即時評価に変更したものです。これにより、変数の値が定義時に確定し、より予測可能な動作になります。clean
ターゲットの追加: 生成されたバイナリファイルを削除するためのclean
ターゲットが追加され、ビルド環境のクリーンアップが容易になりました。
Goソースファイルの変更
- パッケージのインポート変更:
"text/template"
から"html/template"
への変更は、WebアプリケーションでHTMLを安全に生成するために、XSS対策が施されたhtml/template
パッケージを使用するように切り替えたことを示しています。"http"
から"net/http"
への変更は、Go 1でHTTP関連の機能がnet
パッケージの下に再編成されたことに対応しています。
template.ParseFiles
の引数変更:template.ParseFiles(tmpl+".html", nil)
からtemplate.ParseFiles(tmpl + ".html")
への変更は、html/template
パッケージのParseFiles
関数のAPIがGo 1で簡素化され、2番目の引数(nil
)が不要になったことを反映しています。
HTMLドキュメントファイルの変更
- パッケージ名の更新: ドキュメント内の
http
パッケージとtemplate
パッケージへの参照が、それぞれnet/http
とhtml/template
に更新されました。これにより、読者は最新のGo 1のパッケージ名で学習を進めることができます。 - ビルドコマンドの更新:
8g
/8l
コマンドを使用したビルド手順が、go build
コマンドを使用する手順に更新されました。また、Windows環境での実行方法も追記され、より多くのユーザーがコードラボを試せるようになりました。 - Goのインストール要件の更新: Go 1がWindowsを含むより多くのプラットフォームをサポートするようになったことを反映し、インストールに関する記述が更新されました。
os
パッケージの削除: 一部のコード例で不要になったos
パッケージのインポートが削除され、コードの簡潔性が向上しました。- ドキュメントリンクの更新: スライスやエラーに関するドキュメントへのリンクが、Go 1の新しいドキュメント構造に合わせて更新されました。
これらの変更は、Go WikiのコードラボがGo 1の標準に完全に準拠し、読者が最新かつ正確な情報に基づいてGo言語のWebアプリケーション開発を学習できるようにするための包括的な更新です。