Revel模板传参必须用Render传命名参数或导出字段结构体,模板用{{.x}}访问;字段未导出、未判空、参数名大小写错误或@url()参数不匹配均导致渲染为空或404。

必须用 Render 传命名参数或结构体,模板里用 {{.x}} 访问;字段不导出、没传参、没判空,渲染就为空或 panic。
Render 怎么传参才不会丢数据
Revel 不支持直接往模板塞局部变量,所有数据都得靠控制器调用 Render 方法注入。它只认两种传法:
- 命名参数:如
c.Render("title", "首页", "users", users, "count", len(users)),模板中直接写{{.title}}、{{.users}} - 结构体或 map:如
c.Render("data", data),其中data是导出字段的 struct(type Data struct { Users []User }),模板里就得写{{.data.Users}}或提前{{with .data}}切换上下文
别用 map[string]interface{} 混搭传——类型擦除后字段名大小写敏感性易失控,{{.Users}} 可能突然变 {{.users}} 导致渲染失败。
模板里 range 遍历切片为啥报 nil panic
常见错误是没在 range 前判断切片是否为 nil,尤其从数据库查不到数据时返回 nil 切片很常见。Go 模板对 nil 切片直接 {{range .Items}} 就 panic。
- 安全写法:先
{{if .Items}}{{range .Items}}...{{end}}{{else}}暂无数据{{end}} - 如果要传索引给子模板,必须用双变量解构:
{{range $i, $item := .Items}},然后{{template "item.html" $i}}或{{template "item.html" $item}} -
$i是 int 类型索引,$item是当前元素;不加$前缀(如写成i)会在嵌套模板里被覆盖,导致值错乱
嵌套结构体字段为啥模板里取不到
Go 的反射机制要求:模板能访问的字段,必须同时满足「导出」+「命名匹配」。
- 结构体本身和字段名都得首字母大写,比如
type Company struct { Name string },不能是name string - 如果传的是
Company []Company字段,模板里得写{{range .Company}},不是{{range .company}}—— 大小写错一位就取不到 - 嵌套多层时,如
.Data.Companies[0].Name,中间任意一级字段未导出或拼错,整条链就断掉,且无提示,只会渲染为空
@url() 生成带参链接为什么点不开
@url() 是模板里生成反向路由的函数,但参数值稍有不慎就会产出 404 URL。
- 参数名必须和
routes文件里冒号后的名称完全一致,比如路由是GET /hotels/:id Hotels.Show,模板里就得写@url("Hotels.Show" "id" 123),写成"ID"或"hotel_id"都会失败 - 路径参数值里不能含斜线,
@url("Hotels.Show" "id" "123/abc")生成的 URL 是/hotels/123/abc,但路由规则:id只匹配到第一个/前,后面被截断,最终 404 - 整数会被自动转字符串,但 float 或自定义类型不会,传
float64(123)可能触发类型不匹配,建议显式转int或string
最易忽略的是:所有传给 @url() 的值,在路由匹配前不会做合法性校验,错值静默生成非法 URL,前端点开才暴露问题。


















