golang-標準ライブラリ(html/template)


この標準ライブラリは,goがデータ駆動を実現したテンプレートであり,コード注入に対抗できる安全なHTML出力を生成するために用いられる.簡単に言えばhtml、css、javascriptを安全に変換することです.たとえばhtmlのこのラベルの特殊文字<>を変換します.安全なhtmlテンプレートコードを生成する方法もあります.
これに似て、もう一つのパッケージtext/templateは、前者がhtmlを解析し、後者が通常のテキスト文字列を解析するだけです.
まず、簡単なhtmlクリップの変換方法をいくつか見てみましょう.
func HTMLEscapeString(s string) string =》   s HTML         。
func HTMLEscaper(args ...interface{}) string =》             HTML         
func HTMLEscape(w io.Writer, b []byte) =》 w   b HTML      

まずよくあるhtmlエスケープ文字をいくつか認識してみましょう
"
"
"
&
&
&
<
<
<
>
>
>
スペースをどんどん開く(non-breaking space)
 
 
 
コードの例を次に示します.
package main

import (
	"fmt"
	"html/template"
)

func main() {

	s := template.HTMLEscapeString("
hello
") fmt.Println(s) // <div>hello</div> s = template.HTMLEscaper("
","hello","
") fmt.Println(s) // <div>hello</div> // template.HTMLEscape() // html w , }

javascriptコードのエスケープ方法をいくつか見てみましょう
func JSEscapeString(s string) string =》  s JavaScript         。
func JSEscaper(args ...interface{}) string =》           JavaScript         。
func JSEscape(w io.Writer, b []byte) =》 w   b JavaScript      。

javascriptコードのエスケープ例を次に示します.

func main() {

	s := template.JSEscapeString("var a = 'hello'")
	fmt.Println(s) //    var a = \'hello\'

	s = template.JSEscaper("var"," a = ","'hello'")
	fmt.Println(s) //    var a = \'hello\'

	// template.JSEscape() //      javascript           w   ,    
}

urlのエスケープ方法を見てみましょう.
func URLQueryEscaper(args ...interface{}) string =》               URL            
package main

import (
	"fmt"
	"html"
	"html/template"
)

func main() {

	s := template.URLQueryEscaper("name=go&age=10")
	fmt.Println(s) //    name%3Dgo%26age%3D10
	//      URLQueryEscaper          ASCII    ;=  ASCII  3D,   html  EscapeString    ,       :
	fmt.Println(html.EscapeString("name=go&age=10")) //    name=go&age=10
	// html.EscapeString         html            ;=  &amp
}

次にtempldateパッケージが提供する安全な(注入防止)htmlテンプレートコードを生成する方法を見る
まず簡単な方法をいくつか見てみましょう.
func New(name string) *Template =》     name     
func (t *Template) Parse(src string) (*Template, error) =》   src      
func (t *Template) ExecuteTemplate(wr io.Writer, name string, data interface{}) error =》   name  ,     data   ,         wr   
func (t *Template) Execute(wr io.Writer, data interface{}) error =>           ,      。

簡単なコードの例を次に示します.
package main

import (
	"html/template"
	"os"
)

func main() {
	//       ,     ;{{define "T"}}          T   ,         ,    ,
	// {{.}}          ,{{end}}        ,     ;
	temp,_ := template.New("foo").Parse(`{{define "T"}} hello {{.}}{{end}}`)
	//          ,            。
 	temp.ExecuteTemplate(os.Stdout,"T","
go
") // hello <div>go</div> // , {{.}} html , html // temp,_ := template.New("foo").Parse(`hello {{.}}`) // , 。 temp.Execute(os.Stdout,"
go
") // hello <div>go</div> // , {{.}} html , html }

上記の例では、カスタムhtmlテンプレートの使い方を大まかに認識しましたが、htmlテンプレートの他の方法を見てみましょう.
func (t *Template) ParseFiles(filenames ...string) (*Template, error) =》  filenames         。      ,        nil,    (t, nil)。         。Parse           ,ParseFiles      ,       。

ここで,templdateパッケージの基本的な使い方を紹介したとしても,templateパッケージは日常開発においてhtmlクリップテンプレートを生成するために用いられる.あまり使わない.