Gin 不仅适合构建 API 服务,也支持 HTML 模板渲染和静态资源托管,使其可以胜任中小型网站开发任务。
一、模板渲染基础
1. 加载模板文件
使用 LoadHTMLGlob
或 LoadHTMLFiles
方法加载模板:
css
r := gin.Default()
r.LoadHTMLGlob("templates/*") // 支持通配符
或:
arduino
r.LoadHTMLFiles("templates/index.tmpl", "templates/user.tmpl")
2. 定义模板文件(templates/index.tmpl)
xml
<!DOCTYPE html>
<html>
<head>
<title>{{ .Title }}</title>
</head>
<body>
<h1>Hello, {{ .User }}</h1>
</body>
</html>
3. 渲染模板响应
go
r.GET("/", func(c *gin.Context) {
c.HTML(200, "index.tmpl", gin.H{
"Title": "首页",
"User": "Gopher",
})
})
二、模板语法简介(兼容 Go 的 html/template)
1. 输出变量
css
<p>{{ .Name }}</p>
2. 条件语句
css
{{ if .Login }}
<p>Welcome back!</p>
{{ else }}
<p>Please login.</p>
{{ end }}
3. 循环遍历
css
<ul>
{{ range .Items }}
<li>{{ . }}</li>
{{ end }}
</ul>
4. 使用管道函数
css
<p>{{ .Content | html }}</p>
三、自定义模板函数
go
r.SetFuncMap(template.FuncMap{
"formatDate": func(t time.Time) string {
return t.Format("2006-01-02")
},
})
r.LoadHTMLGlob("templates/*")
模板中使用:
css
<p>发布日期:{{ .CreatedAt | formatDate }}</p>
四、静态资源服务
1. 基础静态目录映射
将 /static
路径映射到本地 assets
目录:
vbnet
r.Static("/static", "./assets")
访问方式:
bash
http://localhost:8080/static/css/style.css
2. 映射单个文件(如 favicon)
arduino
r.StaticFile("/favicon.ico", "./assets/favicon.ico")
五、模板热重载(开发调试推荐)
开发阶段可使用第三方工具(如 air)实现模板与代码热重载,提升效率。
安装:
bash
go install github.com/cosmtrek/air@latest
运行:
air
六、示例:构建一个带静态资源和模板页面的简单博客首页
go
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
xml
<!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、图片等静态内容一键映射 |
自定义模板函数 | 灵活扩展渲染逻辑 |