Как объявить глобальную переменную в шаблоне? - PullRequest
0 голосов
/ 23 января 2020

Мне нужно написать шаблон, в котором я сначала определяю некоторые переменные, а затем использую их в том, что будет сгенерировано из шаблона:

{{ if $value.Env.CADDY_URL }}
    {{ $url := $value.Env.CADDY_URL }}
{{ else }}
    {{ $url := printf "http://%s.example.info" $value.Name }}
{{ end }}

{{/* more template */}}
{{/* and here I would like to use $url defined above */}}
{{ $url }}

Я получаю ошибку

undefined variable "$url"

Читая документацию , я вижу, что

Область действия переменной распространяется на действие "end" структуры управления ("if", "with" или "range" ) в котором он объявлен, или в конец шаблона, если такой управляющей структуры нет.

Означает ли это, что глобальных (или ограниченных по всему шаблону) переменных нет? Или есть способ определить $url, чтобы его можно было использовать позже в шаблоне?

1 Ответ

1 голос
/ 23 января 2020

Переменные ограничены. Вы создаете переменную $url внутри блоков {{if}} и {{else}}, поэтому они не видны вне этих блоков.

Создайте переменную перед {{if}} и используйте вместо нее присвоение = объявления :=:

{{$url := ""}}
{{ if . }}
    {{ $url = "http://true.com" }}
{{ else }}
    {{ $url = "http://false.com" }}
{{ end }}

{{ $url }}

Тестирование:

t := template.Must(template.New("").Parse(src))

fmt.Println(t.Execute(os.Stdout, true))
fmt.Println(t.Execute(os.Stdout, false))

Вывод (попробуйте на Go Детская площадка ):

http://true.com<nil>
http://false.com<nil>

Примечание: Изменение переменных шаблона с присваиванием было добавлено в Go 1.11 , поэтому вам необходимо создать приложение с Go 1.11 или новее. Если вы используете более старую версию, вы не можете изменять значения переменных шаблона.

Редактировать: Я нашел дубликат: Как назначить переменные в условном

Вы можете mimi c «изменяемые переменные шаблона» в более ранних версиях, см. Этот вопрос для примеров: В Go диапазоне шаблонов l oop, переменные объявлены вне l oop сбросить на каждой итерации?

...