Go 入門: go template 的基本用法

Go 語言中的模板(Template)是一個強大的工具,它可以讓開發者在生成 HTML、XML、Markdown 等文本格式時,更加簡單高效。Go 的模板語言在設計上非常簡潔,但是在功能上非常強大,它支持基本的控制流、條件語句、變量、函數等,同時還可以通過自定義函數和自定義類型等方式擴展其功能。在本文中,我們將深入學習 Go 語言中的模板,探討其常用功能。

Go 語言中的模板(Template)是一個強大的工具,它可以讓開發者在生成 HTML、XML 等文本格式時,更加簡單高效。Go 的模板語言在設計上非常簡潔,但是在功能上非常強大,它支持基本的控制流、條件語句、變量、函數等,同時還可以通過自定義函數和自定義類型等方式擴展其功能。在本文中,我們將學習 Go 語言中的模板,探討其常用功能。

Go 模板的基本語法

Go 模板的基本語法非常簡潔,它由模板定義和模板執行兩部分組成。模板定義是一個字符串,其中包含了文本和模板指令,用於描述生成文本的規則。模板執行則是將模板定義和數據結構組合起來,生成最終的文本。

下面是一個簡單的 Go 模板例子

package main
import (
  "html/template"
  "os"
)
type Person struct {
  Name string
  Age  int
}
func main() {
  person := Person{Name: "Alice", Age: 20}
  tmpl := `{{.Name}} is {{.Age}} years old.`
  t := template.Must(template.New("person").Parse(tmpl))
  err := t.Execute(os.Stdout, person)
  if err != nil {
    panic(err)
  }
}

在這個例子中,我們定義了一個名爲 Person 的結構體,用於保存人的信息。接着,我們定義了一個名爲 tmpl 的模板,它包含了一個輸出變量 Name 和 Age 的指令。最後,我們將模板和數據組合起來,生成最終的文本輸出到控制檯。

輸出結果:

Alice is 20 years old.

從這個例子中,我們可以看到 Go 模板的基本語法非常簡單,它只需要掌握一些基本的指令即可。

模板指令

在 Go 模板中,指令是由花括號 {} 包含的文本塊,它們告訴模板引擎如何生成文本。指令可以分爲三類:輸出指令、控制指令和註釋指令。

輸出指令

輸出指令用於生成變量的值。在模板中,輸出指令由雙花括號 {{}} 包含,如下所示

{{.Variable}}

其中,Variable 是一個變量名,它的值將會被輸出。在輸出指令中,變量可以是模板參數、模板參數的字段、自定義函數的返回值等

控制指令

控制指令用於控制模板的執行流程,包括條件語句、循環語句、選擇語句等。在模板中,控制指令由單花括號 {} 包含,如下所示:

{{if .Condition}} ... {{else}} ... {{end}}
{{range .Array}} ... {{end}}
{{with .Variable}} ... {{end}}

其中,Condition 是一個條件表達式,Array 是一個數組,Variable 是一個變量。這些指令可以讓我們輕鬆地控制模板的執行流程,根據數據的不同情況生成不同的文本。

註釋指令

註釋指令用於在模板中添加註釋,以便於其他人理解代碼。在模板中,註釋指令由雙花括號和註釋標記組成,如下所示:

{{/* 註釋內容 */}}

其中,註釋內容是任意文本。註釋指令的作用是在模板中添加註釋,以便於其他人理解代碼。

模板函數

在 Go 模板中,函數是一種擴展模板功能的方式。它可以讓我們在模板中使用自定義的函數,對數據進行處理,生成更加豐富的文本。Go 模板內置了一些常用的函數,如 len、html、urlquery 等,我們也可以自定義函數,滿足自己的需求。

下面是一個示例,展示如何在 Go 模板中使用函數:

package main
import (
  "fmt"
  "html/template"
  "os"
  "strings"
)
func main() {
  funcMap := template.FuncMap{
    "upper": strings.ToUpper,
  }
  tmpl := `{{.Name | upper}}`
  t := template.Must(template.New("person").Funcs(funcMap).Parse(tmpl))
  person := struct{ Name string }{"Alice"}
  err := t.Execute(os.Stdout, person)
  if err != nil {
    panic(err)
  }
}

在這個例子中,我們定義了一個名爲 upper 的函數,用於將字符串轉換爲大寫形式。接着,我們在模板中使用了這個函數,將 Name 變量轉換爲大寫形式。最後,我們將模板和數據組合起來,生成最終的文本輸出到控制檯。

輸出結果:

ALICE

從這個例子中,我們可以看到 Go 模板函數的使用非常簡單,只需要定義一個函數映射表,將函數註冊到模板中即可。

模板嵌套

在 Go 模板中,我們可以將多個模板組合起來,實現模板的複用。模板嵌套可以讓我們將頁面的不同部分分開處理,降低代碼的複雜度。

下面是一個示例,展示如何在 Go 模板中進行模板嵌套:

package main
import (
  "html/template"
  "os"
  "strings"
)
type Person struct {
  Name string
  Age  int
}
func main() {
  funcMap := template.FuncMap{
    "upper": strings.ToUpper,
  }
  tmpl := `
{{define "header"}}
  <header>{{.Name}}'s Profile</header>
{{end}}
{{define "body"}}
  <ul>
    <li>Name: {{.Name}}</li>
    <li>Age: {{.Age}}</li>
  </ul>
{{end}}
{{template "header" .}}
{{template "body" .}}
`
  t := template.Must(template.New("person").Funcs(funcMap).Parse(tmpl))
  person := Person{Name: "Alice", Age: 20}
  err := t.Execute(os.Stdout, person)
  if err != nil {
    panic(err)
  }
}

在上面的代碼中,我們定義了兩個模板,一個名爲 header,一個名爲 body。其中,header 模板用於顯示頁面的頭部,body 模板用於顯示頁面的主體內容。接着,我們使用 template 指令將 header 模板和 body 模板組合起來,生成最終的頁面。

輸出結果:

<header>Alice's Profile</header>
<ul>
  <li>Name: Alice</li>
  <li>Age: 18</li>
</ul>

從這個例子中,我們可以看到 Go 模板的模板嵌套功能非常實用,可以將頁面的不同部分分開處理,降低代碼的複雜度。

模板繼承

在 Go 模板中,我們還可以使用模板繼承的方式,實現模板的複用。模板繼承可以讓我們將頁面的不同部分分開處理,降低代碼的複雜度。

下面是一個示例,展示如何在 Go 模板中進行模板繼承:

package main
import (
  "html/template"
  "os"
)
func main() {
  tmpl := `
{{define "base"}}
  <!doctype html>
  <html>
  <head>
    <title>{{template "title" .}}</title>
  </head>
  <body>
    {{template "content" .}}
  </body>
  </html>
{{end}}
{{define "title"}}{{.Name}}'s Profile{{end}}
{{define "content"}}
  <ul>
    <li>Name: {{.Name}}</li>
    <li>Age: {{.Age}}</li>
  </ul>
{{end}}
{{template "base" .}}
`
  t := template.Must(template.New("person").Parse(tmpl))
  person := struct {
    Name string
    Age  int
  }{"Alice", 18}
  err := t.Execute(os.Stdout, person)
  if err != nil {
    panic(err)
  }
}

在上面的代碼中,我們定義了一個名爲 base 的模板,用於定義頁面的基本結構,包括 HTML 頭部、標題和內容。接着,我們使用 template 指令將 title 模板和 content 模板組合起來,生成最終的頁面。

輸出結果:

<!doctype html>
<html>
<head>
  <title>Alice's Profile</title>
</head>
<body>
  <ul>
    <li>Name: Alice</li>
    <li>Age: 18</li>
  </ul>
</body>
</html>

從這個例子中,我們可以看到 Go 模板的模板繼承功能非常實用,可以將頁面的不同部分分開處理,降低代碼的複雜度。

總結

Go 模板是 Go 語言內置的一種模板引擎,具有簡單、靈活、易於學習的特點。Go 模板提供了豐富的指令和函數,可以輕鬆地生成各種文本,包括 HTML、XML、JSON 等。Go 模板還支持模板嵌套和模板繼承,可以降低代碼的複雜度,提高代碼的質量。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/mcNGviYyspiHM86XEIasjw