web-dev-qa-db-ja.com

Goテンプレートで、範囲内の親/グローバルパイプラインにアクセスする

{{range pipeline}} T1 {{end}}パッケージのtext/templateアクション内で、範囲アクションの前にパイプライン値にアクセスすること、または実行に引数として渡される親/グローバルパイプラインにアクセスすることは可能ですか?

私がやろうとしていることを示す実例:

package main

import (
    "os"
    "text/template"
)

// .Path won't be accessible, because dot will be changed to the Files element
const page = `{{range .Files}}<script src="{{html .Path}}/js/{{html .}}"></script>{{end}}`

type scriptFiles struct {
    Path string
    Files []string
}

func main() {
    t := template.New("page")
    t = template.Must(t.Parse(page))

    t.Execute(os.Stdout, &scriptFiles{"/var/www", []string{"go.js", "lang.js"}})
}

play.golang.org

30
ANisus

$変数の使用(推奨)

パッケージから テキスト/テン​​プレート ドキュメント:

実行が開始されると、$は実行に渡されるデータ引数、つまりドットの開始値に設定されます。

@Sandyが指摘しているように、したがって、$.Pathを使用して外部スコープのパスにアクセスすることが可能です。

const page = `{{range .Files}}<script src="{{html $.Path}}/js/{{html .}}"></script>{{end}}`

カスタム変数の使用(古い回答)

投稿後わずか数分で1つの回答が見つかりました。
変数を使用することにより、値をrangeスコープに渡すことができます。

const page = `{{$p := .Path}}{{range .Files}}<script src="{{html $p}}/js/{{html .}}"></script>{{end}}`
36
ANisus