繁体   English   中英

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

[英]How to calculate a total for a column inside a golang 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 DB字段进行的货币交易,根据Iris框架规范,我有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,那么在go模板中,等效于:

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

在Go的模板中,一旦声明了变量并为其分配了值,就无法更改其值。 您的代码中发生的是:

  1. 声明为$TotalPrice := 0.0的外部总价格的值始终为0.0 ,并且变量范围扩展到模板的末尾。
  2. 当您在range定义了名为$TotalPrice的变量时,尽管变量名称相同,但将分配一个全新的变量。 分配给此变量的值由FloatInc($TotalPrice, .TotalPrice) 请注意,参数$TotalPrice表示外部总价为0.0 ,因此该语句将等于$TotalPrice := 0.0 + .TotalPrice 因此,在每次迭代中打印$TotalPrice时,都会得到当前的 .TotalPrice而不是累计的总价。
  3. 在(2)中声明的变量的范围在rangeend之间。 因此,当您在最后一行打印$TotalPrice时,您将获得(1)中声明的外部总价格的值,即0.0

在您的情况下,您需要声明一个将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 }}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM