如何计算 golang 模板内列的总计?

问题描述 投票:0回答:2

我在 html/模板中有这段代码:

{{ $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 go-templates go-html-template
2个回答
3
投票

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

  1. 声明为
    $TotalPrice := 0.0
    的外部总价的值始终为
    0.0
    ,并且变量范围扩展到模板末尾。
  2. 当您在
    $TotalPrice
    内部定义名为
    range
    的变量时,虽然变量名相同,但会分配一个全新的变量。分配给该变量的值由
    FloatInc($TotalPrice, .TotalPrice)
    给出。请注意,参数
    $TotalPrice
    指的是外部总价,即
    0.0
    ,因此该语句将等于
    $TotalPrice := 0.0 + .TotalPrice
    。因此,当您在每次迭代中打印
    $TotalPrice
    时,您会得到 current
    .TotalPrice
    而不是累计总价。
  3. (2)中声明的变量的范围在
    range
    end
    之间。因此,当您在最后一行打印
    $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 }}

0
投票

有一个黑客。

https://masterminds.github.io/sprig/

您可以添加 sprig 模板助手(或类似的东西)并将总和累积为字典中的条目。该库(及其替代方案)提供基本的数学运算、字符串到数字的转换等。

需要更少的代码更改;您只需将这些辅助函数传递给模板 init 即可。

© www.soinside.com 2019 - 2024. All rights reserved.