Template使用教程
===
本机节课程是template下节课程应该是调度任务 然后是小操作 收官是一个小案例
衍生课程是Cloud Native 如果有时间的话,会把这个小案例做成分布式的 大家有空的话 了解下docker
现在就正式开始我们的课程了
*****
我们任意打开一个网站,比如就是这个看云,你们有没有发觉 不同的看云文档 样子都一样,but内容是不一样的?
这里就要说golang 的html/template了
- 初识html/Template
- 变量输出
- 条件处理
- 输出嵌套字段内容
1.初识html/Template
我们在前面的课程发现没有,我们注册这块现在只能post,现在去看看其他的网站,用户注册和登录都有一个页面专门用户显示.
好就从这里开始和html/Template来一次约会
我们想创建一个template目录
创建logo.html 用于展示用户登录
创建static目录用于存放css js 等静态资源
这个我们为了让它好看一点就用bootstrap这个ui框架
这个bootstrap下载下来放到static里
补充知识 怎么让用户访问到这个静态资源呢?
配置文件路由
```
//静态资源
router.ServeFiles("/static/*filepath",http.Dir("./template/static/"))
```
好了我们测试一下是否能通过
http://127.0.0.1:8085/static/ 获取到static下的文件
OK!看到了,现在我们来用bootstript来完善我们的login.html吧
因为等会会以js的方式提交数据,我写了一个js utils在static utils下
大家看看吧
```
<title>{{.Title}}</title>
```
在html中添加{{.Title}}
```
router.GET("/user/addUser",ShowAddUser) // 展示添加用户页面
router.POST("/user/addUser",AddUser) // 添加用户
// url GET /user/addUser
// 展示添加用户页面
func ShowAddUser(w http.ResponseWriter,r *http.Request,p httprouter.Params) {
// 加载模板
files, e := template.ParseFiles("./template/login.html")
if e != nil {
fmt.Println("html 解析出问题了")
response.SendErrorResponse(w,defs.ErrorTemplateError)
return
}
// 往Template填充内容
type Data struct {
Title string
Msg string
}
e = files.Execute(w,&Data{
Title:"注册",
Msg:"html/Template学习",
})
if e != nil {
fmt.Println("填充数据出问题了",e.Error())
response.SendErrorResponse(w,defs.ErrorTemplateError)
return
}
}
```
这样就可以了
*****
我们来简单总结一下:
1.第一步加载html
`files, e := template.ParseFiles("./template/login.html")`
2.第二部填充数据
```
// 往Template填充内容
type Data struct {
Title string
Msg string
}
e = files.Execute(w,&Data{
Title:"注册",
Msg:"html/Template学习",
})
```
### 条件判断
```
<h1>
{{if .Score}}
score is {{.Score}}
{{else}}
no score
{{end}}
</h1>
```
注意{{end}}这个是必须的
对了大家应该会好奇为什么传入的是一个结构体,调用的是结构体的某一个属性!!
```
file.Execute(w,"你好") 这样也可以
如何接收呢?
<h1>{{.}}</h1> 这个.是根节点的意识
```
大家举一反三吧!
### 比较
- gt 大于
- ge 大于等于
- lt 小于
- le 小于等于
- ne 不等
- eq 等于
```
<h1>
{{if gt .Score 90}}
score is A+
{{else if gt .Score 70}}
score is A
{{else if gt .Score 60}}
score is B
{{else}}
score is C
{{end}}
</h1>
```
### 迭代
```
<h1>
{{range $k,$v := .Maps}}
<br>
{{$k}} : {{$v}}
<br>
{{end}}
</h1>
```
range注意:
此处的{{.}}对象会发生改变为Maps
此时或者获取到父级的作用域? {{$.}} 这样就可以了
*****
我在此给出上面的测试数据:
```
r.ParseForm()
score := r.FormValue("score")
i, _ := strconv.Atoi(score)
// 往Template填充内容
type Data struct {
Title string
Msg string
Score int
Maps map[int]string
}
maps := make(map[int]string)
maps[0] = "hello"
maps[1] = "golang"
maps[2] = "你好啊"
e = files.Execute(w,&Data{
Title:"注册",
Msg:"html/Template学习",
Score:i,
Maps:maps,
})
```
小重点来了!
注意要让html获取到数据,我们要维护一个struct,if当数据非常多的时候这个struct也会非常庞大,这样就不利于我们后期的维护
如何解决这个问题呢?
```
e = files.Execute(w,map[string]interface{}{
"Request":r,
"Score":i,
"Msg":"html/Template学习",
"Maps":maps,
})
```
这样我们html又怎么获取呢?
我现在先把原来维护struct版本的代码给出
[https://github.com/dollarkillerx/GolangWebCourseware/tree/2de07dc8b70840c111770fbc074989ea30364dd2](https://github.com/dollarkillerx/GolangWebCourseware/tree/2de07dc8b70840c111770fbc074989ea30364dd2)
哈哈直接用就行了,骚年多尝试啊
[https://github.com/dollarkillerx/GolangWebCourseware/tree/http/template](https://github.com/dollarkillerx/GolangWebCourseware/tree/http/template)
OK Template这个就完结了!
- 初认GOlang Web
- 关于环境配置
- 路由
- 路由进阶与目录架构
- 静态文件服务器
- 自定义Middleware
- 与MySQL起舞
- 主从模式概念
- 部署主从集群
- 分库分表
- 补充:事务
- 补充:常用SQL示例
- Template使用
- 一些小的,但是要知道的东西
- 调度任务
- 流控算法
- 鉴权
- JWT鉴权前置知识:加密解密
- session
- 文件上传与下载
- 带缓存读写拷贝io
- 参考
- 写好的文件上传
- 文件下载
- 拓展:秒传功能实现
- 扩展:分块上传和断点续传
- 扩展:分块上传
- 扩展:断点续传
- 扩展:分布式存储
- 部署ceph集群
- cephAuth
- go操作ceph集群
- 扩展:云存储
- go操作oss
- 补充:xorm框架
- 命令小结
- 补充:xorm框架高级部分
- 补充
- MongoDB
- 基础概念
- 简简单单NoSql
- 操作集合(Collection)
- 操作文档(Document)
- 带条件的文档 db.find
- 复杂条件抽文档 db.find
- redis
- redis操作
- go操作redis
- (新增)配置鉴权
- 密码学
- 文件校验算法
- 未来课程的安排
- RPC实践
- 爬虫
- 正则表达式
- 爬取手机号
- 爬取邮箱
- 爬取超链接
- 爬取身份证号
- 并发爬图片
- 扩展:CICD
- GO实现自动化部署系统
- 国际化支持
- 并发带来问题的解决
- GOWEB小知识
- Sync包讲解
- sync.Pool
- 千万级WebSocket消息推送
- 微服务入门:开篇
- 路由通讯
- RabbitMQ
- RabbitMQ工作原理和转发模式
- Dcoker 下 RabbitMQ and Ui
- Go操作RabbitMQ
- 初步微服务
- go-micro
- 补充:consul
- 快速入门
- 补充:consul超时
- 微服务架构
- 微服务架构全景图
- 服务注册和发现
- raft协议基本概念
- raft协议leader选举详解
- raft协议日志复制详解
- raft协议safefy详解
- rpc调用个服务监控
- etcd
- 命令行使用
- Golang操作etcd
- GO操作etcd OP方式 (分布式锁基础)
- etcd 分布式集群乐观锁
- (新增)鉴权
- 服务注册
- 服务发现原理
- 选项设计模式介绍
- 基于插件的注册组建
- 课前知识
- etcd注册开发1
- ffmpeg
- 2.0新的启航
- 高可用Mysql
- mysql逻辑架构
- 常见的MySQL高可用方案
- 索引
- MYSQL调优
- 什么影响了MYSQL的性能
- Mysql 服务器参数配置
- Go深入并发
- 基本同步原语
- 扩展同步原语
- 原子操作
- M P G 模型
- 简单的消息总线
- GoMicro入门
- GO任务池编写
- GO依赖注入
- 一些补充
- golang defer在什么时候执行
- 分布式理论篇(面试吹牛必备)
- CAP理论
- Raft协议
- 保证注册中心的可靠性
- 链路追踪
- 怎么实现强一致性