如何计算golang模板中列的总数?

时间:2017-08-29 01:35:59

标签: go go-templates go-html-template

我在html / template中有这个代码:

{{ $TotalPrice := 0.0 }}
{{ range $i, $tx := .Transactions }}
{{ $TotalPrice := FloatInc $TotalPrice (StrToFloat .TotalPrice) }}
  <tr>
    <td>{{ inc $i 1 }}</td> 
    <td>{{ .Description.String }}</td>
    <td>{{ .Type }}</td>
    <td>{{ .TotalPrice }}</td>
    <td>{{ .Note }}</td>  
  </tr>  
{{ end }}
<tr>
  <td></td> 
  <td></td>
  <td></td>
  <td>{{ $TotalPrice }}</td>
  <td></td>
  <td></td>
</tr> 

交易是与TotalPrice数据库字段的资金交易,我根据Iris framework规范有4个函数。

tmpl.AddFunc("dec", func(num int, step int) int {
    return num - step
})

tmpl.AddFunc("inc", func(num int, step int) int {
    return num + step
})

tmpl.AddFunc("FloatDec", func(num float64, step float64) float64 {
    return num - step
})

tmpl.AddFunc("FloatInc", func(num float64, step float64) float64 {
    return num + step
})

tmpl.AddFunc("StrToFloat", func(s string) (float64, error) {
    return strconv.ParseFloat(s, 64)
}) 

我注意到$ TotalPrice保持每次迭代的初始值(0.0),因此范围内的{{$ TotalPrice}}将打印.TotalPrice值,而最后一行的$ TotalPrice值也将为0.0那么内部去模板的等价物是什么:

nums := []int{2, 3, 4}
sum := 0
for _, num := range nums {
    sum += num
}
fmt.Println("sum:", sum)

1 个答案:

答案 0 :(得分:2)

在Go的模板中,一旦声明变量并为其赋值,就无法更改其值。你的代码中会发生什么:

  1. 声明为$TotalPrice := 0.0的外部总价格值始终为0.0,变量范围将扩展到模板的末尾。
  2. $TotalPrice中定义名为range的变量时,虽然变量名称相同,但会分配一个全新的变量。分配给此变量的值由FloatInc($TotalPrice, .TotalPrice)给出。请注意,参数$TotalPrice是指外部总价格0.0,因此该语句将等于$TotalPrice := 0.0 + .TotalPrice。因此,当您在每次迭代中打印$TotalPrice时,您获得当前 .TotalPrice而不是累计总价。
  3. (2)中声明的变量范围介于rangeend之间。因此,当您在最后一行打印$TotalPrice时,您获得了在(1)中声明的外部总价格的值,即0.0
  4. 在您的情况下,您需要声明一个以Transactions为参数的函数,然后计算函数内部的总数,例如

    tmpl.AddFunc("sum", func(transactions []Transaction) float64 {
        sum := 0.0
        for _, t := range transactions {
            if v, err := strconv.ParseFloat(t.TotalPrice, 64); err == nil {
                sum += v
            }
        }
        return sum
    })
    

    然后在模板中使用它:

    {{ $TotalPrice := sum .Transactions }}