如何在Golang中使用html/template生成HTML页面_Golang html/template HTML生成方法汇总

html/template包可安全渲染HTML,防止XSS。1. 从字符串或文件加载模板并传入数据渲染;2. 支持嵌套模板实现布局复用;3. 提供if、range等控制结构;4. 默认自动转义,可用template.HTML输出原始HTML;5. 结合net/http用于Web服务动态返回页面。

在Golang中,html/template 包是生成安全HTML页面的标准方式。它不仅能将数据动态渲染到HTML模板中,还能自动转义内容以防止XSS攻击。以下是使用 html/template 生成HTML页面的常用方法汇总。

1. 基本模板渲染

最简单的用法是从字符串或文件加载模板,并将数据传入进行渲染。

// 示例:从字符串渲染模板

package main
import (
  "html/template"
  "log"
  "os"
)

func main() {
  const tpl = zuojiankuohaophpcnh1youjiankuohaophpcnHello, {{.Name}}!zuojiankuohaophpcn/h1youjiankuohaophpcn
  t := template.Must(template.New("example").Parse(tpl))

  data := struct{ Name string }{Name: "Alice"}
  err := t.Execute(os.Stdout, data)
  if err != nil {
    log.Fatal(err)
  }
}

输出:

Hello, Alice!

2. 加载HTML文件模板

通常会把HTML结构放在独立文件中,便于维护。

// 文件:templates/index.html



  {{.Title}}
  
    

{{.Title}}


    

欢迎用户:{{.User}}


  

// Go代码加载并渲染

t, err := template.ParseFiles("templates/index.html")
if err != nil {
  log.Fatal(err)
}

data := struct {
  Title string
  User string
}{
  Title: "首页",
  User: "Bob",
}

t.Execute(os.Stdout, data)

3. 使用模板嵌套(布局与块)

通过 template 动作实现头部、侧边栏等公共部分复用。

// 文件:templates/layout.html



  {{block "title" .}}默认标题{{end}}
  
    {{block "content" .}}

默认内容

{{end}}
  

// 文件:templates/home.html

{{define "title"}}首页 - 我的网站{{end}}
{{define "content"}}

欢迎来到首页

{{end}}

// 加载多个模板文件

t := template.Must(template.ParseGlob("templates/*.html"))
t.ExecuteTemplate(os.Stdout, "layout", nil)

这样就能实现通用布局和页面内容分离。

4. 控制结构:条件判断与循环

模板支持 if、range 等控制逻辑。

{{if .LoggedIn}}
  

你好,{{.Username}}!


{{else}}
  

请登录。


{{end}}


    {{range .Items}}
      
  • {{.}}

  • {{end}}

    // 数据示例

    data := map[string]interface{}{
      "LoggedIn": true,
      "Username": "Charlie",
      "Items": []string{"苹果", "香蕉", "橙子"},
    }

    5. 避免转义:使用 template.HTML 类型

    默认所有输出都会被HTML转义。如果需要输出原始HTML,可使用 template.HTML 类型。

    data := struct {
      Content template.HTML
    }{
      Content: template.HTML("加粗内容"),
    }

    {{.Content}} 将不会被转义,直接输出HTML标签。

    6. 在Web服务中使用模板

    结合 net/http 提供动态网页。

    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
      t, _ := template.ParseFiles("templates/layout.html", "templates/home.html")
      t.ExecuteTemplate(w, "layout", nil)
    )
    http.ListenAndServe(":8080", nil)

    每次请求时渲染模板并返回给客户端。

    基本上就这些。掌握这些方法后,你可以在Go项目中灵活构建安全、结构清晰的HTML页面。关键是理解数据传递、模板复用和转义机制。不复杂但容易忽略细节。