如何计算 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 数据库字段的货币交易,根据 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 也是 go 模板中的等价物:
nums := []int{2, 3, 4}
sum := 0
for _, num := range nums {
sum += num
}
fmt.Println("sum:", sum)
在Go的模板中,一旦你声明了一个变量并为其赋值,你就不能改变它的值。您的代码中发生的事情是:
- 声明为
$TotalPrice := 0.0
的外部总价的值总是0.0
,并且变量范围被扩展到模板的末尾。
- 当你在
range
中定义一个名为$TotalPrice
的变量时,虽然变量名相同,但会分配一个全新的变量。分配给该变量的值由 FloatInc($TotalPrice, .TotalPrice)
给出。请注意,参数 $TotalPrice
指的是外部总价 0.0
,因此该语句将等于 $TotalPrice := 0.0 + .TotalPrice
。因此,当您在每次迭代中打印 $TotalPrice
时,您得到的是 current .TotalPrice
而不是累计总价。
- (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 }}
我在 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 也是 go 模板中的等价物:
nums := []int{2, 3, 4}
sum := 0
for _, num := range nums {
sum += num
}
fmt.Println("sum:", sum)
在Go的模板中,一旦你声明了一个变量并为其赋值,你就不能改变它的值。您的代码中发生的事情是:
- 声明为
$TotalPrice := 0.0
的外部总价的值总是0.0
,并且变量范围被扩展到模板的末尾。 - 当你在
range
中定义一个名为$TotalPrice
的变量时,虽然变量名相同,但会分配一个全新的变量。分配给该变量的值由FloatInc($TotalPrice, .TotalPrice)
给出。请注意,参数$TotalPrice
指的是外部总价0.0
,因此该语句将等于$TotalPrice := 0.0 + .TotalPrice
。因此,当您在每次迭代中打印$TotalPrice
时,您得到的是 current.TotalPrice
而不是累计总价。 - (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 }}