
本文详解 beego 中通过 {{template}} 传递变量的机制,指出传入模板的参数即为子模板中的 .(当前上下文),无需加 .option 等字段访问符,避免 “can't evaluate field option in type string” 错误。
本文详解 beego 中通过 {{template}} 传递变量的机制,指出传入模板的参数即为子模板中的 .(当前上下文),无需加 .option 等字段访问符,避免 “can't evaluate field option in type string” 错误。
在 Beego(基于 Go html/template)中,模板间复用常通过 {{template "name" pipeline}} 实现。关键在于理解 被调用模板的上下文(.)由传入的 pipeline 决定——而非继承父模板的整个数据结构。
例如,主模板中这样调用:
{{range $index, $option := .alternatives}}
<div id="splashAlternative{{$index}}" class="col-sm-2">
<select id="flashSrc_{{$index}}">
{{template "alternative_src.html" $option}} // ← $option 作为 pipeline 传入
</select>
</div>
{{end}}此时,$option 的值(假设是字符串 "xxx" 或 "")将直接成为 alternative_src.html 模板中的 .。因此,子模板中应直接操作 .,而非尝试访问 .option(这会导致类型错误:string 类型没有 option 字段)。
✅ 正确的 alternative_src.html 写法如下:
{{if compare . ""}}
<option value="" selected="selected"></option>
{{else}}
<option value=""></option>
{{end}}
{{if compare . "xxx"}}
<option value="xxx" selected="selected">xxx</option>
{{else}}
<option value="xxx">xxx</option>
{{end}}⚠️ 注意事项:
- . 在子模板中 就是你传入的值本身(如字符串、结构体、map 等),不是包含该值的容器对象;
- 若需传递多个值,可封装为 map 或 struct,再在子模板中通过 .Key 访问;
- Beego 默认启用 html/template 安全机制,所有输出自动 HTML 转义;若需原生 HTML,用 {{. | safeHTML}}(需提前注册 safeHTML 函数);
- 模板名称 "alternative_src.html" 需确保已通过 beego.AddTemplate() 注册或位于 views/ 目录下且路径匹配。
掌握 . 的上下文绑定逻辑,是写出清晰、可维护 Beego 模板的关键基础。


















