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、图片等静态内容一键映射 |
自定义模板函数 | 灵活扩展渲染逻辑 |