Как рассчитать сумму для столбца внутри шаблона Голанга?
У меня есть этот код внутри 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, и у меня есть 4 функции в соответствии со спецификацией Iris Framework.
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 ответ
Решение
В шаблоне Go после того, как вы объявите переменную и присвоите ей значение, вы не сможете изменить ее значение. Что происходит в вашем коде:
- Значение внешней общей цены, которая объявлена как
$TotalPrice := 0.0
всегда0.0
и переменная область действия расширяется до конца шаблона. - Когда вы определили переменную с именем
$TotalPrice
внутриrange
хотя имя переменной совпадает, будет выделена совершенно новая переменная. Значение, присвоенное этой переменной, определяется какFloatInc($TotalPrice, .TotalPrice)
, Обратите внимание, что аргумент$TotalPrice
относится к внешней общей цене, которая0.0
поэтому утверждение будет равно$TotalPrice := 0.0 + .TotalPrice
, Таким образом, когда вы печатаете$TotalPrice
в каждой итерации вы получаете текущий.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 }}