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

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

このコミットは、Go言語の公式コードラボである「Go Wiki」のドキュメントとサンプルコードを、Go 1のリリースに合わせて更新するものです。主な変更点は、パッケージ名の変更(httpからnet/httptemplateから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では、従来のアーキテクチャ固有のコンパイラ(例: 8g6g)とリンカ(例: 8l6l)に代わり、統一された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/templatetext/templateへの分割

Go 1以前のtemplateパッケージは、テキストとHTMLの両方のテンプレート処理を扱っていました。しかし、HTMLテンプレートを扱う際には、クロスサイトスクリプティング(XSS)攻撃を防ぐための特別な注意が必要です。Go 1では、この懸念に対処するため、templateパッケージがtext/templatehtml/templateの2つに分割されました。

  • text/template: あらゆる種類のテキスト出力を生成するための汎用テンプレートエンジンです。セキュリティ上の考慮は行われません。
  • html/template: HTML出力を生成するために特別に設計されたテンプレートエンジンです。自動エスケープ機能が組み込まれており、テンプレートに挿入されるデータがHTMLコンテキストで安全であることを保証し、XSS攻撃のリスクを軽減します。WebアプリケーションでHTMLを生成する際には、常にhtml/templateを使用することが推奨されます。

Goのビルドシステム(旧来の8g/8lgo build

Go 1以前のGoのビルドプロセスは、Unix系のシステムでC言語のコンパイラやリンカに似たツールチェーンを使用していました。例えば、32ビットIntelアーキテクチャ(GOARCH=386)の場合、コンパイラは8g、リンカは8lでした。64ビットIntelアーキテクチャ(GOARCH=amd64)の場合は6g6lが使用されました。これらのコマンドは、特定のアーキテクチャとOSに依存しており、開発者が手動で適切なコマンドを選択する必要がありました。

Go 1では、go buildという統一されたコマンドが導入されました。このコマンドは、ソースファイルを自動的に検出し、適切なコンパイラとリンカを呼び出して実行可能ファイルを生成します。これにより、ビルドプロセスが大幅に簡素化され、クロスプラットフォーム開発が容易になりました。go buildは、Goモジュールシステムと密接に連携し、依存関係の解決とビルドを自動的に行います。

技術的詳細

このコミットにおける技術的な変更は、Go 1のリリースによってもたらされた標準ライブラリとツールチェーンの進化を直接反映しています。

  1. パッケージの再編成とセキュリティ強化:

    • httpからnet/httpへの変更は、Goの標準ライブラリがよりモジュール化され、ネットワーク関連の機能がnetパッケージの下に一元化されたことを示しています。これにより、開発者は関連する機能をより簡単に見つけ、利用できるようになります。
    • templateからhtml/templateへの移行は、Webアプリケーションのセキュリティを向上させるための重要なステップです。html/templateは、デフォルトでHTMLエスケープを実行するため、開発者が明示的にエスケープ処理を記述しなくても、XSS脆弱性を防ぐことができます。これは、Webアプリケーション開発におけるベストプラクティスをGo言語が標準でサポートすることを示しています。
  2. ビルドプロセスの簡素化:

    • MakefileからのMake.incMake.commonの削除、および8g/8lコマンドからgo buildへの置き換えは、Goのビルドシステムが大きく進化したことを意味します。go buildコマンドは、Goのソースコードをコンパイルし、リンクして実行可能ファイルを生成する際の標準的な方法となりました。これにより、開発者はプラットフォームやアーキテクチャの違いを意識することなく、同じコマンドでビルドを実行できるようになり、開発ワークフローが大幅に効率化されました。
    • MakefileにおけるCLEANFILESの定義が+=から:=に変更されたのは、Makefileの変数の評価タイミングに関する細かな調整です。:=は即時評価を意味し、変数が定義された時点で値が確定します。これは、ビルドシステムの堅牢性を高めるための変更と考えられます。
  3. ドキュメントの正確性向上:

    • 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.incMake.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/httphtml/templateに更新されました。これにより、読者は最新のGo 1のパッケージ名で学習を進めることができます。
  • ビルドコマンドの更新: 8g/8lコマンドを使用したビルド手順が、go buildコマンドを使用する手順に更新されました。また、Windows環境での実行方法も追記され、より多くのユーザーがコードラボを試せるようになりました。
  • Goのインストール要件の更新: Go 1がWindowsを含むより多くのプラットフォームをサポートするようになったことを反映し、インストールに関する記述が更新されました。
  • osパッケージの削除: 一部のコード例で不要になったosパッケージのインポートが削除され、コードの簡潔性が向上しました。
  • ドキュメントリンクの更新: スライスやエラーに関するドキュメントへのリンクが、Go 1の新しいドキュメント構造に合わせて更新されました。

これらの変更は、Go WikiのコードラボがGo 1の標準に完全に準拠し、読者が最新かつ正確な情報に基づいてGo言語のWebアプリケーション開発を学習できるようにするための包括的な更新です。

関連リンク

参考にした情報源リンク