Go Template模板使用

go template模板使用

字符变量替换解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package main

import (
"os"
"text/template"
)

func main() {
name := "qipajun"
tmpl, err := template.New("test").Parse("hello, {{.}}") //建立一个test模板,内容是"hello, 使用{{.}}替换变量内容"
if err != nil {
panic(err)
}
err = tmpl.Execute(os.Stdout, name) //将string与模板合成,变量name的内容会替换掉{{.}}
//合成结果放到os.Stdout里
if err != nil {
panic(err)
}
}
//输出 : hello, qipajun

结构体类型模板解析替换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package main

import (
"os"
"text/template"
)

type article struct {
Id int //首字母大写 对外开放访问 不然模板解析不到
Title string
}
func main() {

art := article{10,"hello world"}
//建立一个test模板,使用`{{.Id}}`替换结构体 article.Id 值
tmpl, err := template.New("test").Parse("id: {{.Id}}, title: {{.Title}}")
if err != nil {
panic(err)
}
err = tmpl.Execute(os.Stdout, art)
//合成结果放到os.Stdout里
if err != nil {
panic(err)
}

//输出 id: 10, title: hello world
}

遍历循环输出

1
2
3
4
5
{{range .}}
{{end}}

{{range $i, $v := .slice}}
{{end}}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package main

import (
"os"
"text/template"
)

type article struct {
Id int //首字母大写 对外开放访问 负责模板解析不到
Title string
}
func main() {

art := article{10,"hello world"}
var map4 [5]article
map4[0] = art
map4[1] = art


const tpl = `<div><ul>{{range .}}<li><a href="./article-{{.Id}}.html" >{{.Title}}</a></li>{{end}}</ul></div>`
tmpl, err := template.New("test").Parse(tpl) //建立一个模板,内容是"hello, {{.}}"
if err != nil {
panic(err)
}
err = tmpl.Execute(os.Stdout, map4)
//合成结果放到os.Stdout里
if err != nil {
panic(err)
}

}

多个模板互相应用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package main

import (
"os"
"text/template"
)

func main() {
muban1 := `hi, {{template "M2"}},
hi, {{template "M3"}}
`
muban2 := `我是模板2,{{template "M3"}}`
muban3 := "ha我是模板3ha!"

//建立一个`M1`模板,替换解析`muban1`字符 并且使用` {{template "M2"}}` 替换模板2内容
tmpl, err := template.New("M1").Parse(muban1)
if err != nil {
panic(err)
}
//M2模板中 又使用` {{template "M3"}}` 替换模板3内容
tmpl.New("M2").Parse(muban2)
if err != nil {
panic(err)
}
tmpl.New("M3").Parse(muban3)
if err != nil {
panic(err)
}
err = tmpl.Execute(os.Stdout, nil)
if err != nil {
panic(err)
}

//输出内容
/**
hi, 我是模板2,ha我是模板3ha!,
hi, ha我是模板3ha!
*/
}

Parse 解析字符串模板
template.ParseFiles 从文件读取模板解析

  • 其它用法

if

1
2
3
4
5
{{if .Attended}}
true line
{{else}}
false line
{{end}}
  • 相关判断符号
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
       eq
    Returns the boolean truth of arg1 == arg2
    ne
    Returns the boolean truth of arg1 != arg2
    lt
    Returns the boolean truth of arg1 < arg2
    le
    Returns the boolean truth of arg1 <= arg2
    gt
    Returns the boolean truth of arg1 > arg2
    ge
    Returns the boolean truth of arg1 >= arg2
  • with 如果不为空就替换模板打印 如果空就不输出
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    package main

    import (
    "text/template"
    "os"
    "fmt"
    )

    func main() {

    const letter = `
    {{with .Gift}}
    <p>{{.}}</p>
    {{end}}
    `

    type Recipient struct {
    Name, Gift string
    Attended bool
    }
    var recipients = []Recipient{
    {"Aunt Mildred", "bone china tea set", true},
    {"Uncle John", "moleskin pants", false},
    {"Cousin Rodney", "", false},
    }

    t := template.Must(template.New("letter").Parse(letter))
    t.Execute(os.Stdout, recipients)
    // Execute the template for each recipient.
    for _, r := range recipients {

    err := t.Execute(os.Stdout, r)
    if err != nil {
    fmt.Println("executing template:", err)
    }
    }
    }