Поскольку 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())
Вызов метода xm () действителен, если набор методов (тип) x содержит m и аргументсписок может быть назначен на список параметров м. Если x адресуемый и набор методов & x содержит m, xm () является сокращением для (& x) .m ()