Как вызвать функцию по пользовательскому типу - PullRequest
0 голосов
/ 05 декабря 2018

Я видел несколько похожих вопросов, но не могу найти тот, который решает мою проблему.

У меня есть пользовательский тип 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, так в чем же проблема?

1 Ответ

0 голосов
/ 05 декабря 2018

Похоже, ваша data структура не экспортируется.Сделайте это:

type Data struct { 

}
...