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

news2024/11/29 0:33:26

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

<!DOCTYPE html>
<html>

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

<body>
    {{ . }}
</body>

</html>

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

package main

import (
	"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 main

import (
	"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 main

import (
	"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 main

import (
	"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.coloradmin.cn/o/532932.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

openwrt修改web网页默认端口

使用SSH登录openwrt后台&#xff1b; openwrt 中默认使用的web服务器是uhttpd&#xff0c; 进入配置文件路径&#xff1a; cd /etc/config/ 使用vim编辑器修改uhttpd文件 vi uhttpd 修改以上标红部分后面的端口 vim编辑器打开uhttpd 文件 修改完成后点键盘ESC退出编辑状态&a…

《计算机网络—自顶向下方法》 Wireshark实验(四):TCP 协议分析

在因特网协议族&#xff08;Internet Protocol Suite&#xff09;中&#xff0c;TCP 层是位于 IP 层之上&#xff0c;应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接&#xff0c;但是 IP 层不提供这样的流机制&#xff0c;而是提供不可靠的包交换。…

docker could not find driver

先介绍环境 使用的是dockerdocker-compose部署了nginxphpmysqlredis框架用的是laravel 再详细介绍每个服务/框架的版本&#xff1a; nginx1.24php8.1-fpmmysql8.0.25redis7.0.8laravel9.33.0 本篇可不用理会 redis 主要是讲解 php 为什么会出现 "could not find drive…

Datacom-HCIE 01(10月26日更新)--含解析

单选题 1.[试题编号&#xff1a;189684] &#xff08;单选题&#xff09;防火墙双机热备场景下&#xff0c;主备设备之间通过哪种协议实现会话表备份&#xff1f; 2.[试题编号&#xff1a;189682] &#xff08;单选题&#xff09;中间人攻击或IP/MAC Sp fing攻击都会导致信息…

Docker笔记6 | 关于仓库的一些基本知识梳理

6 | 关于仓库的一些基本知识梳理 1 Docker Hub1.1 简介和登陆1.2 拉取镜像1.3 推送镜像1.4 自动构建 2 私有仓库2.1 简介2.2 安装docker-registry2.3 上传镜像2.4 查看镜像2.5 下载镜像 1 Docker Hub 1.1 简介和登陆 Docker Hub是Docker官方维护的一个公共仓库&#xff1b;注…

使用intellij Idea 创建spring boot项目

1、问题&#xff1a;使用Spring Initializr创建的工程&#xff0c;没有src目录&#xff0c;原因是创建的时候&#xff0c;默认选择的地址是https://start.spring.io 由于默认的spring官网的地址在国内比较难访问&#xff0c;当访问不了的时候可以使用阿里云的地址&#xff1a;…

银行零售业务转型方法论:打造数字化的“有机体”

传统的业务增长进度叫做连续性创新&#xff0c;它是在一条曲线上渐进性的改良和发展&#xff0c;但这种发展终有极限&#xff0c;如果不能及时开辟第二增长曲线&#xff0c;就很容易被时代所抛弃。过去十年&#xff0c;以互联网为代表的数字化转型的先行者&#xff0c;不断冲击…

网页三剑客之 CSS

css 在这里不会介绍太多&#xff0c;我们主要重点介绍两个&#xff1a;选择器和盒子模型就够用了。这里看个乐就好了&#xff0c;没有那么多重点&#xff0c;只是简单的认识一下下CSS。 CSS 是什么 CSS 是层叠样式表 (Cascading Style Sheets)的缩写它存在的意义就是&#xf…

MTSC2023中国互联网测试开发大会将于7月15日在上海举办

一年一度的行业盛会&#xff0c;MTSC2023 中国互联网测试开发大会&#xff0c;将从上海开始。 在为期1天的时间里&#xff0c;主办方将邀请一线技术专家、资深行业大咖与大家齐聚一堂&#xff0c;针对当前热门行业话题以及最新的落地实践&#xff0c;进入深入探讨与分享&#…

《CSS揭秘》笔记

前言 《CSS揭秘》&#xff0c;由Lea Verou编著&#xff0c;由CSS魔法翻译&#xff0c;本篇主要记录阅读《CSS揭秘》过程中的一些要点及收获 第二章 背景与边框 box-shadow与outline box-shadow 利用box-shadow可以绘制多重边框&#xff0c;设置其前三个变量均为0&#xff…

在 Python 中如何使用位运算符来进行布尔运算?

Python 中常见的运算符有&#xff1a; &#xff08;1&#xff09;算术运算符&#xff1a;加号 、减号 - 、乘号 * 、除号 / 、取余数 % 、幂运算 ** 、整除 // 。 &#xff08;2&#xff09;比较运算符&#xff1a;等于 、不等于 ! 、大于 > 、小于 < 、大于等于 >…

【Processing】创意编程零基础学习笔记

博客简介 最近出于兴趣爱好&#xff0c;在学习Processing创意编程。此篇博客用来记录我学习Processing创意编程的基础知识&#xff0c;在我学习Processing的过程中&#xff0c;我会持续修改、更新这篇博客。运用Processing写的一些有趣的小项目&#xff0c;会更新在Procesing专…

Speech and Language Processing之RNN

循环神经网络(RNN)是在其网络连接中包含循环的任何网络。也就是说&#xff0c;任何一个单元的值直接或间接依赖于作为输入的早期输出的网络。虽然这种网络很强大&#xff0c;但很难进行推理和训练。然而&#xff0c;在一般的循环网络中&#xff0c;有一些被证明在应用于口语和书…

深入浅析Linux物理内存外碎片化

本文出现的内核代码来自Linux4.19&#xff0c;如果有兴趣&#xff0c;读者可以配合代码阅读本文。 一、Linux物理内存外碎片化概述 什么是Linux物理内存碎片化&#xff1f;Linux物理内存碎片化包括两种&#xff1a; 1.物理内存内碎片&#xff1a;指分配给用户的内存空间中未…

【Linux命令】fdisk 相关分区命令

fdisk 命令既可以对Ubuntu上已有磁盘进行分区&#xff0c;也可以对SD卡进行分区。假设我们要对最新检测到的 /dev/sdb 设备进行分区。 sudo fdisk /dev/sdb 目录 1、 查看分区情况 —— p 2、删除分区 —— d 3、新增分区 —— n 4、修改分区类型 —— t 5、保存之前所有…

DI依赖注入(setter注入、构造器注入、自动装配、集合注入)

文章目录 1 setter注入1.1 环境准备1.2 注入引用数据类型步骤1:声明属性并提供setter方法步骤2:配置文件中进行注入配置步骤3:运行程序 1.3 注入简单数据类型步骤1:声明属性并提供setter方法步骤2:配置文件中进行注入配置步骤3:运行程序 2 构造器注入2.1 环境准备2.2 构造器注入…

统计学02: 二项分布

<~生~信~交~流~与~合~作~请~关~注~公~众~号生信探索> n 次伯努力事件(发生和不发生概率和为1) 发生r次的概率 期望&#xff1a; &#xff0c;方差&#xff1a; using DistributionsdBinomial(4, 0.35);mean(d) 4*0.35var(d) 4*0.35(1-0.35) Example We asked various p…

用Jenkins搭建自动构建服务

Jenkins是BS跨平台构建工具&#xff0c;之前名为Hundson。wiki 【chs en】 最新windows安装包&#xff1a;下载 下文以1.593版本为例&#xff0c;讲述Jenkins的Windows版本的一些要注意的地方 安装 安装路径中不要出现中文或者空格 用户数据相关的目录结构 ├─Jenkins …

精选 100 种最佳 AI 工具大盘点

为了应对对精简流程和数据分析日益增长的需求&#xff0c;整合人工智能工具在多个领域变得至关重要。 本文精选了2023年可用的100种最佳人工智能工具&#xff0c;旨在提高您的生产力、创造力和效率。 以下是 2023 年排名前 100 的人工智能工具&#xff1a; Aidoc&#xff1a;A…

音频格式m4a怎么转换成mp3,高效工具分享

音频格式m4a怎么转换成mp3&#xff1f;因为当我们下载或是保存的音频格式为m4a时&#xff0c;当我们需要在汽车或是其他平台播放时&#xff0c;就要将音频格式m4a转换成mp3。这样做可以提高音频文件的兼容性、便携性和可用性&#xff0c;并且可以减小文件大小以便于共享和传输。…