📜  GoLang 中的模板(1)

📅  最后修改于: 2023-12-03 15:01:02.172000             🧑  作者: Mango

GoLang 中的模板

在 Go 语言的开发中,模板是一个不可或缺的组件。Go 语言内置了文本模板和 HTML 模板两种类型的模板,并且都提供了非常易用的 API。

内置的文本模板

文本模板的处理非常简单,它会将输入的字符串中的所有 {{.}} 替换成对应的数据。例如,下面这个例子中将会把字符串 Hello {{.}}! 中的 {{.}} 替换成 "world"

package main

import (
  "os"
  "text/template"
)

func main() {
  tmpl, _ := template.New("example").Parse("Hello {{.}}!")
  tmpl.Execute(os.Stdout, "world")
}

输出:

Hello world!

上面的例子中,我们首先创建了一个模板 example,然后用 Execute 方法执行模板。Execute 方法需要传入两个参数,第一个是用于输出的 IO 接口,第二个是模板需要的数据。

如果我们想要用多个数据填充模板,可以将第二个参数改成一个数组或一个结构体:

package main

import (
  "os"
  "text/template"
)

func main() {
  tmpl, _ := template.New("example").Parse("Hello {{index . 0}} and {{index . 1}}!")
  data := []string{"Alice", "Bob"}
  tmpl.Execute(os.Stdout, data)
}

输出:

Hello Alice and Bob!

需要注意的是,. 表示当前的数据对象,可以使用 index . 0 的方式访问数组、切片和 map 中的元素。

内置的 HTML 模板

HTML 模板比文本模板复杂一些,它同样支持占位符,不过还能处理模板嵌套和条件语句等功能。

下面是一个简单的例子,用于生成下拉框:

package main

import (
  "os"
  "html/template"
)

type Option struct {
  Value string
  Label string
}

type Select struct {
  Name    string
  Options []Option
}

func main() {
  tmpl := template.Must(template.New("example").Parse(`
    <select name="{{.Name}}">
      {{range .Options}}
        <option value="{{.Value}}">{{.Label}}</option>
      {{end}}
    </select>
  `))
  data := Select{
    Name: "fruit",
    Options: []Option{
      {"apple", "苹果"},
      {"banana", "香蕉"},
      {"orange", "橘子"},
    },
  }
  tmpl.Execute(os.Stdout, data)
}

输出:

<select name="fruit">
  <option value="apple">苹果</option>
  <option value="banana">香蕉</option>
  <option value="orange">橘子</option>
</select>

在上面的例子中,我们首先定义了两个结构体,一个用于表示下拉框的选项,另一个用于表示整个下拉框。然后通过 template.New 方法创建了一个模板对象,并且用 Must 方法包装起来,以便在出错时立即终止程序。

模板中的 {{range .Options}} 用于遍历 Select.Options 数组,并且通过 {{.Value}}{{.Label}} 替换占位符。

关于模板的更多用法,可以参考 text/templatehtml/template 的官方文档。