Gin 不僅適合構建 API 服務,也支持 HTML 模板渲染和靜態資源托管,使其可以勝任中小型網站開發任務。
一、模板渲染基礎
1. 加載模板文件
使用?LoadHTMLGlob
?或?LoadHTMLFiles
?方法加載模板:
r?:=?gin.Default()
r.LoadHTMLGlob("templates/*")?//?支持通配符
或:
r.LoadHTMLFiles("templates/index.tmpl",?"templates/user.tmpl")
2. 定義模板文件(templates/index.tmpl)
<!DOCTYPE?html>
<html>
<head><title>{{?.Title?}}</title>
</head>
<body><h1>Hello,?{{?.User?}}</h1>
</body>
</html>
3. 渲染模板響應
r.GET("/",?func(c?*gin.Context)?{c.HTML(200,?"index.tmpl",?gin.H{"Title":?"首頁","User":??"Gopher",})
})
二、模板語法簡介(兼容 Go 的 html/template)
1. 輸出變量
<p>{{?.Name?}}</p>
2. 條件語句
{{?if?.Login?}}<p>Welcome?back!</p>
{{?else?}}<p>Please?login.</p>
{{?end?}}
3. 循環遍歷
<ul>{{?range?.Items?}}<li>{{?.?}}</li>{{?end?}}
</ul>
4. 使用管道函數
<p>{{?.Content?|?html?}}</p>
三、自定義模板函數
r.SetFuncMap(template.FuncMap{"formatDate":?func(t?time.Time)?string?{return?t.Format("2006-01-02")},
})
r.LoadHTMLGlob("templates/*")
模板中使用:
<p>發布日期:{{?.CreatedAt?|?formatDate?}}</p>
四、靜態資源服務
1. 基礎靜態目錄映射
將?/static
?路徑映射到本地?assets
?目錄:
r.Static("/static",?"./assets")
訪問方式:
http://localhost:8080/static/css/style.css
2. 映射單個文件(如 favicon)
r.StaticFile("/favicon.ico",?"./assets/favicon.ico")
五、模板熱重載(開發調試推薦)
開發階段可使用第三方工具(如?air)實現模板與代碼熱重載,提升效率。
安裝:
go?install?github.com/cosmtrek/air@latest
運行:
air
六、示例:構建一個帶靜態資源和模板頁面的簡單博客首頁
func?main()?{r?:=?gin.Default()r.LoadHTMLGlob("templates/*")r.Static("/static",?"./assets")r.GET("/",?func(c?*gin.Context)?{posts?:=?[]string{"Go?入門",?"Gin?實戰",?"部署技巧"}c.HTML(200,?"index.tmpl",?gin.H{"Title":?"Golang?博客","Posts":?posts,})})r.Run()
}
模板內容:templates/index.tmpl
<!DOCTYPE?html>
<html>
<head><title>{{?.Title?}}</title><link?rel="stylesheet"?href="/static/css/style.css">
</head>
<body><h1>{{?.Title?}}</h1><ul>{{?range?.Posts?}}<li>{{?.?}}</li>{{?end?}}</ul>
</body>
</html>
七、小結
功能 | 優點說明 |
模板渲染 | 使用 Go 原生?html/template ,安全高效 |
支持條件與循環 | 動態頁面結構易于控制 |
靜態資源托管 | 支持 JS、CSS、圖片等靜態內容一鍵映射 |
自定義模板函數 | 靈活擴展渲染邏輯 |