Go html/template 输出 HTML JS CSS 等网页元素

概述

html/template 模板工具包在渲染前会对变量内容( html 标签、url 等数据 )进行安全性替换,导致我们无法输出想要的 html 标签。

如 :

package main

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


func main() {
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		a := `<a href="https://www.lesscode.work/">www.lesscode.work</a>`
		t := template.New("index.html")
		t, err := t.ParseFiles("./templates/index.html")
		if err != nil {
			fmt.Printf("err: %v\n", err)
		}
		t.Execute(w, map[string]any{"a": a})
	})
	http.ListenAndServe(":8080", nil)
}
<html>
<body>
    {{.a}}
</body>
</html>

以上代码运行后会原样输出 a 标签的文本内容,而不会渲染一个 a 标签 :


<html>
<body>
    <a href="https://www.lesscode.work/">www.lesscode.work</a>
</body>
</html>

template.HTML() 函数

可以通过 template.HTML() 函数来实现输出一个 html 标签的功能。

package main

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

func main() {
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		a := `<a href="https://www.lesscode.work/">www.lesscode.work</a>`
		t := template.New("index.html")
		t, err := t.ParseFiles("./templates/index.html")
		if err != nil {
			fmt.Printf("err: %v\n", err)
		}
		t.Execute(w, map[string]any{"a": template.HTML(a)})
	})
	http.ListenAndServe(":8080", nil)
}

template.CSS() 函数

可以通过 template.CSS() 函数来实现输出一段样式的功能。

template.JS() 函数

可以通过 template.JS() 函数来实现输出一段JS代码的功能。

template.URL() 函数

可以通过 template.URL() 函数来实现输出url数据的功能( 比如一个 base64 格式的图片数据 )。