如何在自定义类型上调用函数

时间:2018-12-05 05:00:37

标签: go go-templates

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

我有一个自定义的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,这是什么问题?

1 个答案:

答案 0 :(得分:-1)

您的data结构似乎未导出。 这样做:

type Data struct { 

}