你如何将结构传递给 go 中的子模板?

How do you pass structs to subtemplates in go?

我试图了解如何在 Go 中多次使用相同的模板传递不同的结构。

这是我试过的:

import (
    "fmt"
    "html/template"
    "os"
)

type person struct {
    id    int
    name  string
    phone string
}

type page struct {
    p1 person
    p2 person
}

func main() {
    p1 := person{1, "Peter", "1001"}
    p2 := person{2, "Mary", "1002"}
    p := page{p1, p2}

    fmt.Println(p)

    t := template.Must(template.New("foo").Parse(`
    {{define "s1"}}
    <span id="{{.id}}">{{.name}} {{.phone}}</span>
    {{end}}
    {{template "s1" {{.p1}}}}{{template "s1" {{.p2}}}}
    `))

    t.Execute(os.Stdout, p)
}

但它没有按预期工作:

panic: template: foo:5: unexpected "{" in template clause

预期输出为:

<span id="1">Peter 1001</span><span id="2">Mary 1002</span>

当你调用模板函数时,你给了 2 个参数(由 space 分隔):

  • 定义的模板名称(“s1”)
  • 您反对:.p1 在您的案例中

所以这里有一个适用于您的情况的模板:

    t := template.Must(template.New("foo").Parse(`
    {{ define "s1" }}
        <span id="{{ .id }}">{{.name}} {{ .phone }}</span>
    {{ end }}

    {{ template "s1" .p1 }}
    {{ template "s1" .p2 }}
    `))
}