Templates golang中模板内的变量

Templates golang中模板内的变量,templates,variables,go,go-templates,Templates,Variables,Go,Go Templates,html/text模板中变量的名称空间是什么?我原以为变量$x可以更改模板内的值,但本例表明我不能 当我尝试按年份对锦标赛进行分组时,我失败了-类似于这样(): 编辑:有关最新答案,请参阅 原始答复: : 变量的作用域扩展到控件的“结束”操作 声明的结构(“如果”、“有”或“范围”),或 如果没有这样的控制结构,模板的结尾 因此,您使用{{$prev_year:=$year}}定义的$prev_year仅在..之前有效。。下一行({{end}}) 看来没有办法解决这个问题 “正确”的方法是将该

html/text
模板中变量的名称空间是什么?我原以为变量
$x
可以更改模板内的值,但本例表明我不能

当我尝试按年份对锦标赛进行分组时,我失败了-类似于这样():

编辑:有关最新答案,请参阅


原始答复:

:

变量的作用域扩展到控件的“结束”操作 声明的结构(“如果”、“有”或“范围”),或 如果没有这样的控制结构,模板的结尾

因此,您使用
{{$prev_year:=$year}}
定义的
$prev_year
仅在..之前有效。。下一行(
{{end}}

看来没有办法解决这个问题

“正确”的方法是将该逻辑从模板中取出,并在Go代码中进行分组

以下是一个工作示例:

如答案所述,变量“re assignment”的范围以
{{end}}
块结束。因此,仅使用标准变量无法解决此问题,应在执行模板的Go程序内解决此问题

但在某些框架中,这并不是那么容易(例如protoc gen gotemplate)

将向标准模板语言添加其他功能。其中一种是可变映射,可通过以下方式使用:

// init the dictionary (you can init it without initial key/values as well)
{{$myVar := dict "key" "value"}}

// getting the "key" from the dictionary (returns array) and then fetching the first element from that array
{{pluck "key" $myVar | first}}

// conditional update block
{{if eq "some" "some"}}
     // the $_ seems necessary because Go template functions need to return something
     {{$_ := set $myVar "key" "newValue"}}
{{end}}

// print out the updated value
{{pluck "key" $myVar | first}}
这个小例子打印出来:

value
newValue
一种实用的方法是对所有可变变量使用一个字典,并将它们作为键存储在相应的变量名下

参考:

在go1.11中,这意味着可以对原始代码进行很小的修改

改变

{{$prev_year:=$year}}


通过编写
{{$prev_year:=$year}}
您正在创建一个全新的变量。非常感谢,但这也有问题。我花了一些时间思考,并没有找到真正惯用的解决方案。在这种情况下,我认为,这是最好的回报,非常感谢,但这也是有问题的。模板中的映射在ASC oreder中呈现,我需要DESC。因此,我将使用较少的方法为year创建一个类型。在我的例子中,排序也是不必要的,真实数据来自数据库,因此排序很简单。我花了一些时间思考,并没有找到真正惯用的解决方法。最好的维护方法可能是return[]struct{PrevYear*int;Tournament}@lofcek:你说得对,对于你想要做的事情,映射不是一个好的结构。我添加了一个执行以下操作的工作示例:job@lofcek,看起来HectorJ回答了你的问题。你能接受答案吗?
{{$prev_year:=0}}
{{range}}
块是键之前。变量必须在赋值之前初始化。
value
newValue
{{$prev_year:=$year}}
{{$prev_year = $year}}