很多人把 Gin 误解成“只会写 REST API”。
不是。
Gin 内建就支持多种渲染方式。
#1. JSON / XML / YAML / ProtoBuf 等回执
r.GET("/ticket/json", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"id": "T-1001",
"status": "open",
})
})
r.GET("/ticket/xml", func(c *gin.Context) {
c.XML(http.StatusOK, gin.H{
"id": "T-1001",
"status": "open",
})
})#2. HTML 页面也能直接发
r.LoadHTMLGlob("templates/*")
r.GET("/dashboard", func(c *gin.Context) {
c.HTML(http.StatusOK, "index.tmpl", gin.H{
"title": "高速交警值班看板",
})
})这意味着 Gin 不是只能做“纯 API 中枢”,它也能做:
- 管理后台
- 传统服务端渲染页面
- 混合型 Web 应用
#3. 静态文件也能挂
r.Static("/assets", "./assets")
r.StaticFile("/favicon.ico", "./assets/favicon.ico")#4. 安全一点的 JSON 回执
如果你担心某些老旧场景下的 JSON hijacking,可以用:
c.SecureJSON(http.StatusOK, gin.H{
"data": []string{"A-17", "A-18"},
})所以从“回执能力”上看,Gin 更像:
高速交警中枢
├── JSON 处罚单
├── XML 协议回执
├── HTML 看板页面
├── 静态资源公告栏
└── 文件与数据流输出