Я видел несколько похожих вопросов, но не могу найти тот, который решает мою проблему.
У меня есть пользовательский тип Money
, который связывает int64 с функцией, которая форматирует значение в виде строки:
type Money int64
func (m *Money) Format() string {
abs := math.Abs(int64(*m))
dollars := int64(abs) / 100
cents := int64(abs) % 100
sign := ""
if *m < 0 {
sign = "-"
}
return fmt.Sprintf("%s$%d.%0.2d", sign, dollars, cents)
}
У меня есть шаблон HTML, которому я передаю структуру данных.Структура имеет список элементов счета-фактуры, каждый из которых имеет поле Money и другое поле Money, содержащее сумму.
type InvoiceItem {
// ...
Cost money.Money
}
type data struct {
Name string
Items []*model.InvoiceItem
StartDate time.Time
EndDate time.Time
Total money.Money
}
Я передаю data
своему шаблону и выполняю его:
t := template.Must(template.New(title).Parse(templateString))
t.Execute(&buf, data)
В моем шаблоне я выбираю элементы счета и вызываю функцию Format
для объекта Money
.Это работает:
{{range .Items}}
<tr>
<td>{{.Description}}</td>
<td>{{.Cost.Format}}</td>
</tr>
{{end}}
Позже я пытаюсь напечатать итоговое поле:
<td><strong>{{ .Total.Format }}</strong></td>
Мои шаблоны выдают ошибку:
... executing "Invoice Items" at <.Total.Format>: can't evaluate field Format in type money.Money
Почему это такЯ могу вызвать Format
в поле Money
, когда я перебираю список элементов счета, но я не могу вызвать его для объекта data.Total
?Из сообщения об ошибке кажется, что шаблон знает, что тип Total
равен Money
, так в чем же проблема?