Как рассчитать сумму для столбца внутри шаблона Голанга?

У меня есть этот код внутри 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 после того, как вы объявите переменную и присвоите ей значение, вы не сможете изменить ее значение. Что происходит в вашем коде:

  1. Значение внешней общей цены, которая объявлена ​​как $TotalPrice := 0.0 всегда 0.0и переменная область действия расширяется до конца шаблона.
  2. Когда вы определили переменную с именем $TotalPrice внутри rangeхотя имя переменной совпадает, будет выделена совершенно новая переменная. Значение, присвоенное этой переменной, определяется как FloatInc($TotalPrice, .TotalPrice), Обратите внимание, что аргумент $TotalPrice относится к внешней общей цене, которая 0.0поэтому утверждение будет равно $TotalPrice := 0.0 + .TotalPrice, Таким образом, когда вы печатаете $TotalPrice в каждой итерации вы получаете текущий .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 }}
Другие вопросы по тегам