web-dev-qa-db-ja.com

golangテンプレートのループ内のループ外の値にアクセスする

私はこの構造を持っています:

type Site struct {
    Name string
    Pages []int
}

Siteのインスタンスを template に渡します。

すべてのページのリストを書きたい場合は、

{{range .Pages}}
    <li><a href="{{.}}">{{.}}</a></li>
{{end}}

ループ内でNameフィールドを使用する最も簡単な方法は何ですか(たとえば、hrefName/pageに変更する)?

外部オブジェクトがテンプレートに渡されたグローバルオブジェクトであるという事実に基づくソリューションは問題ないことに注意してください。

47
Denys Séguret

テンプレートに渡された変数は$

{{range .Pages}}
    <li><a href="{{$.Name}}/{{.}}">{{.}}</a></li>
{{end}}

(「変数」の下の text/template ドキュメントを参照してください。)

68
chowey

どうですか:

{{$name := .Name}}
{{range $page := .Pages}}
    <li><a href="{{$name}}/{{$page}}">{{$page}}</a></li>
{{end}}

または、単にPagesを名前として値を持つマップにしますか?

type Site struct {
    Pages map[string]string
}


{{range $page, $name := .Pages}}
    <li><a href="{{$name}}/{{$page}}">{{$page}}</a></li>
{{end}}
9
creack

外側のオブジェクト(またはそのプロパティ)の変数を明示的に宣言するよりも簡単な解決策はないようです:

{{$out := .}}
{{range .Pages}}
    <li><a href="{{$out.Name}}/{{.}}">{{.}}</a></li>
{{end}}

編集:この答えはもう正しいものではありません。代わりにchoweyの答えを見てください。

6
Denys Séguret