我见过类似的问题,但找不到解决我问题的方法。

我有一个自定义的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模板。该结构上有一个发票项目列表,每个发票项目都有一个“钱”字段,另一个有“钱”字段来保存总计。
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,那是什么问题呢?

最佳答案

看来您的data结构未导出。
做这个:

type Data struct {

}

08-03 13:24