golang web学习随便记6-模板引擎

news/2024/11/25 10:32:08/

以下代码是几乎最简单的一个模板,{{ . }} 表示执行模板时将嵌入的数据

<!DOCTYPE html>
<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>Go Web 编程</title>
</head><body>{{ . }}
</body></html>

程序也足够简单,就是解析模板文件得到模板对象,执行模板输出结果

package mainimport ("html/template""net/http"
)func process(w http.ResponseWriter, r *http.Request) {t, _ := template.ParseFiles("tpl.html")t.Execute(w, "Golang编程就是简单")
}func main() {server := http.Server{Addr: "127.0.0.1:8088",}http.HandleFunc("/process", process)server.ListenAndServe()
}

运行结果为

模板可以是模板文件,也可以是字符串,在上述代码中添加一个处理器函数

// ...........................
func process2(w http.ResponseWriter, r *http.Request) {strtpl := `
<!DOCTYPE html>
<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>Go Web 编程</title>
</head><body>{{ . }}
</body></html>
`t := template.New("strtpl.html")t, _ = t.Parse(strtpl)t.Execute(w, "字符串模板也简单")
}// .......................http.HandleFunc("/process2", process2)
// .......................

其实,对于文件模板,也是可以先New一个模板实例,然后用实例的ParseFiles方法解析模板文件。直接template.ParseFiles相当于生成了以文件名为模板名的模板实例。ParseFiles方法接受的参数是可变个数的,所以,实际应用中是一堆模板相互嵌套时,会把参数先放在一个数组,然后调用ParseFiles时将数组打散传入。模板中有多个文件时,必须有一个“主模板”,如果执行模板时没有指定“主模板”(调用的是Execute方法),那么第一个将作为“主模板”。指定主模板时(调用的是ExecuteTemplate方法),如果模板是未命名的,那么就用模板文件名作为模板名。模板解析过程中可能产生错误,用 template.Must(...) 包裹模板解析函数的调用过程是一种“偷懒”的错误处理模式,这种模式下,发生错误时将产生panic。

golang web学习随便记1-快速入门_sjg20010414的博客-CSDN博客   中有基本的模板嵌套情况。

下面我们来看模板中的动作。先来看条件动作:模板文件tpl.html

<!DOCTYPE html>
<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>模板动作</title>
</head><body>{{ if . }}数字大于5!{{ else }}数字为5或小于5!{{ end }}<hr>
</body></html>
package mainimport ("html/template""math/rand""net/http""time"
)func actionif(w http.ResponseWriter, r *http.Request) {t, _ := template.ParseFiles("tpl.html")rand.Seed(time.Now().Unix())t.Execute(w, rand.Intn(10) > 5)
}func main() {server := http.Server{Addr: "127.0.0.1:8088",}http.HandleFunc("/actionif", actionif)server.ListenAndServe()
}

运行并从浏览器访问,得到的结果可能是2种之一:

然后来看迭代动作 :需要注意的是,迭代动作range,有可选的(fallback)选项 else,即没有数据时显示点什么。如果没有该选项,要处理无数据提示会麻烦很多。


<body><ul>{{ range . }}<li>{{ . }}</li>{{ else }}<li>当前无数据</li>{{ end }}</ul>
</body>
package mainimport ("html/template""net/http"
)func actionrange(w http.ResponseWriter, r *http.Request) {t, _ := template.ParseFiles("tpl.html")daysOfWeek := []string{"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"}t.Execute(w, daysOfWeek)
}func main() {server := http.Server{Addr: "127.0.0.1:8088",}http.HandleFunc("/actionrange", actionrange)server.ListenAndServe()
}

 显示结果为:

前面代码中,{{ . }} 的值都是golang代码执行模板时提供的确定值,但模板也提供了设置动作,可以在指定区域内使用模板内设定的其他值。

<body><div>最难的语言是 {{ . }}</div><div>{{ with "C++" }}最难的语言是 {{ . }}{{ else }}最难的语言还是 {{ . }}{{ end }}</div><div>最难的语言又是 {{ . }} </div>
</body>
package mainimport ("html/template""net/http"
)func actionwith(w http.ResponseWriter, r *http.Request) {t, _ := template.ParseFiles("tpl.html")t.Execute(w, "Rust")
}func main() {server := http.Server{Addr: "127.0.0.1:8088",}http.HandleFunc("/actionwith", actionwith)server.ListenAndServe()
}

输出结果为:(第二个图是把html模板中的C++去掉,刷新后得到的,不用重启服务器)

 


http://www.ppmy.cn/news/68868.html

相关文章

C语言200行代码实现简易三子棋

前言 三子棋应该是是我们最早接触到的棋类游戏&#xff0c;用C语言实现三子棋对初学者来说是一种不错的锻炼 编写三子棋只需要用到数组、函数和生成随机数的知识&#xff0c;所以比较适合成为编程学习者编写的第一个小游戏。 一.代码实现 第一部分是源码复制就可以使用&…

C++基础篇:05 静态成员与单例模式

1 静态成员 1.1 什么是静态成员 被static修饰的成员变量、成员函数都称为静态成员 1.2 普通成员的特点 普通成员变量&#xff1a;每个类对象中都独有一份成员变量&#xff0c;相互之间没有任何关联 普通成员函数&#xff1a;都隐藏着一个this指针 1.3 静态成员的特点 静态成…

深入探究C++中的仿函数和迭代器——提升你的STL技能

&#x1f4d6;作者介绍&#xff1a;22级树莓人&#xff08;计算机专业&#xff09;&#xff0c;热爱编程&#xff1c;目前在c&#xff0b;&#xff0b;阶段>——目标Windows&#xff0c;MySQL&#xff0c;Qt&#xff0c;数据结构与算法&#xff0c;Linux&#xff0c;多线程&…

一分钟图情论文:《公共图书馆法》视域下的馆员知识与能力体系探究

一分钟图情论文&#xff1a;《公共图书馆法》视域下的馆员知识与能力体系探究 在公共服务体系建设过程中&#xff0c;图书馆建设是十分关键地一环&#xff0c;在图书馆建设过程中又以图书馆员队伍的建设首当其冲。在当今复杂的信息环境下&#xff0c;我们该如何培养图书馆员&a…

Mybatis二级缓存详解

目录 二级缓存 MyBatis的缓存机制整体设计以及二级缓存的工作模式 二级缓存的划分 使用二级缓存&#xff0c;必须要具备的条件 一级缓存和二级缓存的使用顺序 二级缓存实现的选择 MyBatis自身提供的二级缓存的实现 二级缓存的作用 二级缓存的作用域 二级缓存应用场景…

NexNosql Client与chatGPT的对话

问&#xff1a;Nexnosql client有哪些优点&#xff1f; 答&#xff1a;nexnosql client 的优点包括&#xff1a; 即开即用&#xff0c;无需部署服务&#xff0c;最大限度降低使用成本。高度集成&#xff0c;Elasticsearch、Redis、MongoDB&#xff0c;非关系型数据库一网打尽…

ROS 下 激光扫描仪 YDLidar-G4 使用

环境配置&#xff1a; ubuntu20.04 LTS ROS noetic 编程工具&#xff1a;vs code&#xff0c;远程通过ssh访问 扫描仪&#xff1a;YDLidar-G4 YDLidar驱动&#xff1a; YDLidar SDK YDLidar ROS 功能包 此环境包含树莓派&#xff0c;以下过程在树莓派3B上测试通过&#xff0c…

canal学习-运行canal-adapter源码并记录解决报错问题(一)

运行canal-adapter 1. 下载canal源码1.1 下载源码并安装好环境1.2 查看目录结构 2.项目运行2.1 项目打包2.2 项目打包可能遇到的问题&#xff1a;1.Failure to find com.alibaba.otter:connector.tcp:jar:jar-with-dependencies:1.1.52.com.alibaba.druid.pool.DruidDataSource…