c.json与c.xml均接受状态码和可序列化go值,但c.json输出application/json且字段名默认使用结构体字段名,c.xml输出application/xml且需xml tag显式控制字段名;xml不支持map直接序列化,字段必须导出否则为空。

c.JSON 与 c.XML 的参数和行为差异
两者都接受状态码和任意可序列化的 Go 值,但底层序列化逻辑和 Content-Type 不同:c.JSON 输出 application/json,c.XML 输出 application/xml。结构体字段必须导出(首字母大写),且 XML 需要显式 tag 才能控制字段名,比如 xml:"user_name";而 JSON 默认用字段名,也可用 json:"user" 覆盖。
常见错误是传入 map 或 struct 后返回空响应或 500 错误——通常因为结构体字段未导出,或嵌套值含不可序列化类型(如 func、chan、map[interface{}]interface{})。
-
c.JSON(200, map[string]interface{}{"name": "a", "age": 18})可行 -
c.XML(200, struct{ Name string }{Name: "a"})会输出<?xml version="1.0" encoding="UTF-8"?><struct><name>a</name></struct>,但若字段小写(name string)则不会出现在 XML 中 - XML 不支持 map 直接序列化,会 panic;必须用 struct 或自定义类型实现
xml.Marshaler
HTML 模板渲染必须先加载,否则 panic
c.HTML 不会自动查找模板文件,必须提前调用 r.LoadHTMLGlob("templates/*") 或 r.LoadHTMLFiles("templates/index.tmpl")。路径是相对于当前工作目录(不是 go run 文件所在目录),容易因执行位置不同而报 template: "index.tmpl" is undefined。
模板文件名必须与 c.HTML 第二个参数完全一致(包括扩展名),且不能含路径前缀。例如 LoadHTMLGlob("templates/*") 后,c.HTML(200, "index.tmpl", data) 正确,但 c.HTML(200, "templates/index.tmpl", data) 会失败。
- 推荐统一用
.tmpl后缀,避免与静态 HTML 混淆 - 如果模板里引用了
{{.Title}},传入的 data 必须是 map 或 struct,且Title字段需导出 - 不支持嵌套子目录通配,
LoadHTMLGlob("templates/**/*")无效;多级目录需显式列出或改用LoadHTMLFiles
YAML 和 ProtoBuf 渲染的适用边界
c.YAML 是调试友好型格式,输出带缩进的纯文本,Content-Type 为 application/x-yaml。它对结构体字段要求与 JSON 类似,但不支持 gin.H(即 map[string]interface{})直接传入——会 panic,必须用 struct 或自定义类型。
c.ProtoBuf 用于 gRPC 兼容场景,输出二进制数据,Content-Type 为 application/x-protobuf。它要求传入对象实现 proto.Message 接口,通常是 protoc 生成的 struct,不能是普通 struct 或 map。
-
c.YAML(200, struct{ Name string }{Name: "x"})✅;c.YAML(200, gin.H{"name": "x"})❌ -
c.ProtoBuf(200, &example.Test{Label: proto.String("x")})✅;c.ProtoBuf(200, map[string]string{})❌ - ProtoBuf 渲染失败时无明确错误日志,只会返回空响应 + 200 状态码,需检查对象是否真正实现了
proto.Message
AsciiJSON、PureJSON 和 SecureJSON 的实际用途
这些是 c.JSON 的变体,解决特定安全或兼容性问题:AsciiJSON 把中文等 Unicode 字符转成 \uXXXX 形式,适合老旧客户端不支持 UTF-8 的情况;PureJSON 不转义 、<code>>、&,可用于返回已预处理的 HTML 片段(但需自行确保 XSS 安全);SecureJSON 在数组响应前加 while(1); 前缀,防止 JSON 劫持(现已基本淘汰,现代浏览器已缓解该风险)。
- 除非对接遗留系统,否则默认用
c.JSON即可 -
PureJSON若传入含用户输入的字符串,可能引发 XSS,务必过滤或转义后再传入 -
SecureJSON对非数组响应无额外处理,和c.JSON行为一致
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











