随心的博客

好记性不如个烂笔头,随心记录!

返回顶部

go html template

前言:

在一些前后端不分离的Web架构中,我们通常需要在后端将一些数据渲染到HTML文档中,从而实现动态的网页(网页的布局和样式大致一样,但展示的内容并不一样)效果。

正文:

模板文件通常定义为.tmpl.tpl为后缀(也可以使用其他的后缀.html,.htm

模板文件中使用{{}}包裹和标识需要传入的数据

 

模板使用文档:https://go-zh.org/pkg/html/template/

模板语法:

{{.}}

模板语法都包含在{{}}之间,其中{{.}}中的点表示当前对象。

template中,点 . 表示当前作用域的当前对象

 

template 实例1:简单的加载模板实例

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

func index(w http.ResponseWriter, r *http.Request) {
    //解析模板文件
    temp, err := template.ParseFiles("template/index.tpl")

    //解析html内容
    //temp, err := template.New("test").Parse("<h1>{{.}}</h1>")

    if err != nil {
        fmt.Println("err:", err)
    }
    //输出到浏览器
    temp.Execute(w, "hello template")

    //输出到控制台
    //temp.Execute(os.Stdout, "hello template")

}
main:
http.HandleFunc("/index", index)
    http.ListenAndServe("127.0.0.1:80", nil)

index.tpl template:

go template<br />
{{.}}

template 实例2:模板加载map数据实例

func index(w http.ResponseWriter, r *http.Request) {
    //解析模板文件
    temp, err := template.ParseFiles("template/index.tpl")
    //解析html内容
    //temp, err := template.New("test").Parse("<h1>{{.}}</h1>")
    if err != nil {
        fmt.Println("err:", err)
    }
    user := make(map[string]string)
    user["name"] = "lampol"
    user["email"] = "5644645633@qq.com"
    //输出到浏览器
    temp.Execute(w, user)

    //输出到控制台
    //temp.Execute(os.Stdout, "hello template")
}

main:
http.HandleFunc("/index", index)
http.ListenAndServe("127.0.0.1:80", nil)
template:
<p>{{.}}</p>
<p>name: {{.name}}</p>
<p>email:{{.email}}</p>
<p>输出文本:{{"hello world!"}}</p>
<p>注释:{{/* "hello world!" */}}</p>
<p>去除空格: 11  {{- "22" -}}  33</p>

 

 

 

模板管道

pipeline是指产生数据的操作,可以使用管道符号|链接多个命令,

用法和unix下的管道类似:|前面的命令将运算结果(或返回值)传递给后一个命令的最后一个位置

<p>{{ . | println "hello" }} </p>

<p>{{ . | len }} </p>

print printf println 分别等价于fmt包中的SprintSprintfSprintln

管道实例1:管道在html模板中使用

<p>使用管道| println: {{.name | println "hello"}} </p>

<p>使用管道| len: {{.name | len}} </p>

 

<p>声明变量 $len: {{ $len := len .name}} </p>

<p>调用变量 $len: {{ $len}} </p>

模板中if判断

注意 关系表达式  要放在前面  (eq, nt,lt,gt,ge,le,ne)

{{ if  gt .age 33 }}
<p>年龄大于33</p>
{{ else if lt .age  33 }}
<p>年龄小于33</p>
{{ end }}

模板中循环的使用

range循环:

<p>range 循环</p>

{{ range $k,$v := .}}

    <p>{{$k}} ====== {{$v}}</p>

{{end}}

with内置函数:

with 用来设置 . 的值

 

{{with "hello"}}

<p>{{.}}</p>

{{end}}

输出 hello

 

{{with .name}}

<p>with: {{.}}</p>

{{end}}

输出 .name的值

 

内置函数:

 

 

not 非  

 

and

 

or

 

eq 等于

 

ne 不等于

 

lt 小于

 

le 小于等于

 

gt 大于

 

ge 大于等于

 

 

 

内置函数实例:

 

{{ if and .isLogin .isVip}}

 

    <p>登录成功 并且是 VIP</p>

 

{{end}}

 

 

 

{{ if or .isLogin .isVip}}

 

<p>登录成功 或者是 VIP</p>

 

{{end}}

 

 

 

{{ if not .isLogin}}

 

    <p>登录失败</p>

 

{{else}}

 

    <p>登录成功</p>

 

{{end}}

 

模板自定义函数

Go的模板支持自定义函数。需要注意的是自定义函数必须在解析模板之前。

 

自定义函数后,需要使用:Funcs(template.FuncMap{"add": Add}) 加载函数才可以使用

 

自定义函数示例:

func Add(a, b int) int {

return a + b

}

 

func index(w http.ResponseWriter, r *http.Request) {

//解析模板文件

temp, err := template.New("index.tpl").

Funcs(template.FuncMap{"add": Add}).

ParseFiles("template/index.tpl")

 

if err != nil {

fmt.Println("err:", err)

}

user := make(map[string]interface{})

user["name"] = "lampol"

//输出到浏览器

temp.Execute(w, user)}

 

html

<p>add fun:{{ add 5 3}}</p>

 

模板嵌套示例1:加载其他页面

temp, err := template.New("index.tpl").
   Funcs(template.FuncMap{"add": Add}).
   ParseFiles("template/index.tpl", "template/user.tpl")

 

html

index.tpl中加载 user.tpl

{{ template "user.tpl" . }}

 

模板嵌套示例2:加载代码块

 

temp, err := template.New("index.tpl").

Funcs(template.FuncMap{"add": Add}).

ParseFiles("template/index.tpl")

 

html

index.tpl中加载 user.tpl

 

引入user.tpl代码块

{{ template "user.tpl" . }}

 

{{define "user.tpl"}}

    <p>hello user.tpl name:{{.name}}</p>

{{end}}

 

Block示例:

block等价于define定义一个名为name的模板,并在"有需要"的地方执行这个模板

block实例:

tpl模板页面调用content代码块:

{{block "content" .}} {{end}}

 

block代码块定义:

{{define "content"}}

    <h5>block content name:{{.name}}</h5>

{{end}}

 

 

完结

 

posted @ 2023-04-06 22:08  yangphp  阅读(105)  评论(0编辑  收藏  举报