我正在尝试编写一个模板(使用html / template),并向其传递带有附加一些方法的结构,其中许多方法返回多个值。有什么方法可以从模板中访问它们吗?我希望能够执行以下操作:
package main
import (
"fmt"
"os"
"text/template"
)
type Foo struct {
Name string
}
func (f Foo) Baz() (int, int) {
return 1, 5
}
const tmpl = `Name: {{.Name}}, Ints: {{$a, $b := .Baz}}{{$a}}, {{b}}`
func main() {
f := Foo{"Foo"}
t, err := template.New("test").Parse(tmpl)
if err != nil {
fmt.Println(err)
}
t.Execute(os.Stdout, f)
}
Run Code Online (Sandbox Code Playgroud)
但是显然这是行不通的。周围没有办法吗?
我考虑过在我的代码中创建一个匿名结构:
data := struct {
Foo
a int
b int
}{
f,
0,
0,
}
data.a, data.b = f.Baz()
Run Code Online (Sandbox Code Playgroud)
并将其传递进去,但更希望在模板中包含一些内容。有任何想法吗?我还尝试编写一个包装函数,将其添加到funcMaps中,但是根本无法使它正常工作。
感谢您的任何建议!
您将无法调用在模板中返回两个值的函数,除非这些值之一是错误。这是为了保证您的模板在运行时工作。如果您有兴趣,这里有一个很好的答案可以解释这一点。
要解决您的问题,您需要 1) 将您的函数分解为两个单独的 getter 函数,您可以在模板中的适当位置调用它们;或 2) 让您的函数返回一个包含内部值的简单结构。
我不知道哪个更适合你,因为我真的不知道你的实现需要什么。Foo 和 Baz 没有给出很多线索。;)
这是选项一的快速示例:
type Foo struct {
Name string
}
func (f Foo) GetA() (int) {
return 1
}
func (f Foo) GetB() (int) {
return 5
}
Run Code Online (Sandbox Code Playgroud)
然后相应地修改模板:
const tmpl = `Name: {{.Name}}, Ints: {{.GetA}}, {{.GetB}}`
Run Code Online (Sandbox Code Playgroud)
希望这会有所帮助。:)