首页 > 其他分享 >go html template

go html template

时间:2023-04-06 22:26:51浏览次数:42  
标签:index err tpl html user template go 模板

前言:

在一些前后端不分离的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"] = "[email protected]"
    //输出到浏览器
    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包中的Sprint、Sprintf、Sprintln

管道实例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}}

 

 

完结

 

标签:index,err,tpl,html,user,template,go,模板
From: https://www.cnblogs.com/ypeih/p/17294427.html

相关文章

  • Django笔记十八之save函数的继承操作和指定字段更新等实例方法
    本文首发于微信公众号:Hunter后端原文链接:Django笔记十八之save函数的继承操作和指定字段更新等实例方法这篇笔记主要介绍Django一些实例方法。什么是实例,我们知道通过filter()的一些筛选方法,得到的是QuerySet,而QuerySet取单条数据,通过索引,或者first()或者last()等......
  • go net/http包的使用
    前言:Go语言标准库内建提供了net/http包,涵盖了HTTP客户端和服务端的具体实现。使用net/http包,我们可以很方便地编写HTTP客户端或服务端的程序。 正文:包的文档地址:https://go-zh.org/pkg/net/http net/http包使用说明:注册路由http.HandleFunc("/index",getHandle)  ......
  • go cookie && session
    前言: HTTP协议是无状态的,所以用户的每一次请求都是无状态的,不知道在整个Web 操作过程中哪些连接与该用户有关。应该如何来解决这个问题呢?Web里面经典的解决方案是Cookie和Session。正文:cookie机制是一种客户端机制,把用户数据保存在客户端,而Session机制是一种服......
  • pycharm中配置MongoDB数据库出现未找到驱动程序类 'com.dbschema.MongoJdbcDriver' (v
      之前重新装了一下pycharm,发现MongoDB数据库连接时发生了错误。具体错误:未找到驱动程序类'com.dbschema.MongoJdbcDriver'(view)。这怎么解决呢?其实很简单,在驱动程序中选一个版本进行下载就好了。步骤如下:1、找到驱动程序,点击MongoDB,再点击+号。2、找到最新版本,点击下载......
  • 自定义View实现HTML图文环绕效果
    Android中并没有提供HTML图文环绕效果的View,最接近的算是TextView中的ImageSpan了,但并未完全实现图文环绕(图文混排)的效果。1、Android系统TextView的ImageSpan实现图文环绕代码如下:TextViewtv=newTextView(this);SpannableStringspanStr=n......
  • 判断是否安装了Google地图
    判断是否安装了Google地图,没有弹出Dialog提示安装:/** *ForGoogleMapsCheck * *@return */ privatebooleanisGoogleMapsInstalled(){ try{ ApplicationInfoinfo=getPackageManager().getApplicationInfo( "com.google.andro......
  • (转)go深入:reflect 运行时反射
    原文:https://lingzihuan.icu/posts/go-13-depth-reflect/啥是反射go语言中,反射为我们提供了一种可以在运行时操作任意类型对象的能力,比如,查看一个接口变量的具体类型、看一个结构体有多少字段、修改某个字段的值等。比如 fmt.Println:funcPrintln(a...interface{})(nint,......
  • HTML5学习
    Html5学习1、初识HTMLHTML:\(\textcolor{red}{H}\)yper\(\textcolor{red}{T}\)ext\(\textcolor{red}{M}\)arkup\(\textcolor{red}{L}\)anguage:超文本\(\textcolor{red}{标记语言}\),包括文字、图片、音频、动画等。W3C:\(\textcolor{red}{W}\)orld\(\textcolor{red}{W}\)i......
  • day7 golang GMP
    大名鼎鼎的GMP模型需要自行学习的知识:进程、线程、协程、多线程、线程池、io多路复用,内核态用户态,,同步阻塞异步非阻塞等等相关知识代码是在线程中运行的,协程也是,所以当协程阻塞的时候该线程也阻塞了,其他任务就无法调度了,该线程就死了。如何解决,那就需要让协程自由的在线程中移......
  • goodFeaturesToTrack
    一、goodFeaturesToTrack1、过程:1)函数查找图像中或指定图像区域中最突出的角点(1)函数使用cornerMinEigenVal或cornerHarris计算每个源图像像素的角点质量度量。(2)函数执行非最大值抑制(保留3x3邻域中的局部最大值)。(3)最小特征值小于qualityLevel*maxx,yqualityMeasureMap(x,y)......