Подтвердить что ты не робот

В шаблонах 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

4b9b3361

Ответ 1

Использование переменной $(рекомендуется)

Из пакета text/template документация:

Когда выполнение начинается, $устанавливается на аргумент данных, переданный в Execute, то есть на начальное значение точки.

Как указывает @Sandy, поэтому можно получить доступ к Пути во внешней области с помощью $.Path.

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

Использование пользовательской переменной (старый ответ)

Нашел один ответ через несколько минут после публикации.
Используя переменную, значение может быть передано в область range:

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