Go模板无法调用字段上的方法

net/mail.Address我有一个提供一些编组逻辑的包装器。我试图在模板中使用它,但我不断收到can't evaluate field String in type EmailAddress. 模板文档说:

数据的 niladic 方法的名称,前面带有句点,例如

  。方法

结果是调用以点为接收者的方法 dot.Method() 的值。

方法调用可以链接并与任何深度的字段和键组合:

  .Field1.Key1.Method1.Field2.Key2.Method2

因此,考虑到这一点,我写了这样的内容:

我已经单独验证了调用EmailAddress.String是完全合法的,所以我无法弄清楚为什么唯一的输出是:


Error: template: Sample Text:1:13: executing "Sample Text" at <.From.String>: can't evaluate field String in type main.EmailAddress

编辑

根据评论者的建议,我将调用从.From.String和更改.To.String为.From.Address.String和.To.Address.String,因为


“String未定义于EmailAddress,它定义于EmailAddress.Address”


但结果是一样的:


Error: template: Sample Text:1:13: executing "Sample Text" at <.From.Address.String>: can't evaluate field String in type mail.Address


森栏
浏览 126回答 1
1回答

海绵宝宝撒

由于String是用指针接收器定义的,因此您需要将“可寻址”实例传递mail.Address给模板才能执行该方法。您可以通过传入一个指向 的指针来完成此操作f。if err := tmpl.Execute(&buff, &f); err != nil {     panic(err) }或者您可以通过传递指针来做到这一点EmailAddress。type emailFormatter struct {    From *EmailAddress    To   *EmailAddress}// ...f := emailFormatter{    To:   &to,    From: &from,}// ...if err := tmpl.Execute(&buff, f); err != nil {    panic(err)}或者通过传入一个指向 的指针mail.Address。type EmailAddress struct{ *mail.Address }// ...to := EmailAddress{    &mail.Address{        Address: "em@i.l",        Name: "",    },}from := EmailAddress{    &mail.Address{        Address: "no-reply@test.quest",        Name: "",    },}f := emailFormatter{    To:   to,    From: from,}// ...if err := tmpl.Execute(&buff, f); err != nil {    panic(err)}请注意,您不需要在 Go 代码中执行此操作的原因是编译器会为您执行此操作。例如:fmt.Println(to.String())变成:fmt.Println((&to).String())如果 x(的类型)的方法集包含 m 并且参数列表可以分配给 m 的参数列表,则方法调用 xm() 是有效的。如果 x 是可寻址的并且 &x 的方法集包含 m,则 xm() 是 (&x).m() 的简写
打开App,查看更多内容
随时随地看视频慕课网APP