Go 1.19模板执行报错:{{range}}分支上下文不一致问题求助
Go模板
range报错{{range}} branches end in different contexts的原因与解决办法 问题场景
我通过JavaScript实现了表单下拉框的联动效果,初始化时需要遍历表单的每一行,调用自定义函数onRuleAreaChange来配置字段。最初使用的Go模板代码如下:
// Initialise all the rows {{- range $i,$v := .}} onRuleAreaChange(document.getElementById('ruleArea{{$i}}')); {{- end}}
但Go 1.19抛出错误:{{range}} branches end in different contexts,排查后未发现语法缺失。添加一行手动初始化第一行的代码后,错误消失,但生成的输出重复了第一行,不符合预期:
修改后的模板:
// Initialise all the rows onRuleAreaChange(document.getElementById('ruleArea0')); {{- range $i,$v := .}} onRuleAreaChange(document.getElementById('ruleArea{{$i}}')); {{- end}}
生成的输出:
onRuleAreaChange(document.getElementById('ruleArea0')); onRuleAreaChange(document.getElementById('ruleArea0')); onRuleAreaChange(document.getElementById('ruleArea1'));
预期输出:
onRuleAreaChange(document.getElementById('ruleArea0')); onRuleAreaChange(document.getElementById('ruleArea1'));
报错原因
这个错误源于Go模板的上下文感知校验机制:
当range是模板中负责生成输出的唯一代码块时,模板引擎会检查range的两个分支(有数据时的循环体、无数据时的空分支)是否处于相同的输出上下文。
原始模板中,若传入的.是空切片/数组,range不会生成任何输出,此时空分支(无输出)和有数据分支(输出JS语句)的上下文不统一,模板引擎因此抛出错误。
添加固定的onRuleAreaChange调用后,无论range是否有数据,模板都会输出JS代码,空分支(仅输出固定代码)和有数据分支(固定代码+循环代码)的上下文统一为输出JS语句,错误自然消失。
正确解决方法
不需要添加重复代码,只需要给range添加明确的空分支,保证上下一致即可:
方法1:添加else分支兼容空数据场景
// Initialise all the rows {{- range $i,$v := .}} onRuleAreaChange(document.getElementById('ruleArea{{$i}}')); {{- else}} // No rows to initialise {{- end}}
这样即使传入的数据为空,模板也会输出一行注释,上下文保持统一,同时不会出现重复输出的问题。
方法2:空else分支(适用于确定数据非空场景)
如果能保证传入的.至少包含一个元素,也可以直接使用原始的range代码,只需添加一个空的else分支:
// Initialise all the rows {{- range $i,$v := .}} onRuleAreaChange(document.getElementById('ruleArea{{$i}}')); {{- else}}{{- end}}
通过以上方法,既能解决原始的报错,又能得到预期的输出结果。
内容的提问来源于stack exchange,提问作者Touring Tim
相关产品推荐
相关产品推荐

