Revel框架模板中需正确使用if和range语法:if判断布尔值或非空状态直接写{{if .Field}},多分支用{{else if}};比较须用eq等内置函数;range遍历切片推荐双变量绑定{{$i, $t := .Items}},nil切片需先用if检查,map遍历键值顺序为{{$k, $v := .Map}}。

在Revel框架中动态渲染不同用户状态或遍历数据列表时,必须正确使用if条件判断和range循环语法,否则模板会编译失败或渲染出空内容。
模板中用if判断布尔值或非空状态
直接写{{if .IsAdmin}}即可判断结构体字段是否为true,无需加括号或==符号;该写法也适用于切片、map、字符串等类型的非空检查——Go模板会自动调用len()或nil判断。
若需多分支判断,用{{else if}}衔接,注意中间不能换行或加空格:{{else if .IsLoggedIn}}
欢迎用户 {{.UserName}}
{{else}}请登录{{end}}。
⚠️ 【不支持 == 运算符】 比较字符串或数值必须用内置函数,如{{if eq .Role "admin"}},写成{{if .Role == "admin"}}将导致模板编译报错。
range遍历切片并安全获取索引与元素
方法一:双变量绑定(推荐)
使用{{$i, $t := .Items}}形式显式声明索引和元素变量,$前缀确保变量作用域仅限当前range块内,避免与外层同名字段冲突。
方法二:单变量遍历(仅需元素)
{{range .Items}}
{{end}}——此时.代表当前迭代项,但无法访问原始切片索引。
方法三:嵌套子模板传参
在range内部调用子模板时,必须显式传入所需变量:{{template "item.html" $t}} 或 {{template "item.html" dict "index" $i "item" $t}}。
避免nil panic的range安全写法
第一步:先用if包裹range,防止传入nil切片崩溃
{{if .Posts}} {{range .Posts}}
{{end}} {{else}}
暂无文章
{{end}}
第二步:若需默认空切片,控制器中应初始化为[]*Post{}而非nil,否则{{range .Posts}}直接panic。
第三步:对map遍历时,key和value接收顺序为{{$k, $v := .UserMap}},与切片相反——切片是索引在前,map是键在前。


















