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協議
- 保證注冊中心的可靠性
- 鏈路追蹤
- 怎么實現強一致性