为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
森栏 2023-07-31 15:10:13
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
查看完整描述

1 回答

?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

由于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() 的简写


查看完整回答
反对 回复 2023-07-31
  • 1 回答
  • 0 关注
  • 118 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信