如何在模板中声明全局变量?

问题描述 投票:0回答:1

我需要写一个模板,首先定义一些变量,然后在将从模板中生成的变量中使用它们:

{{ 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"

阅读documentation,我看到了

变量的范围扩展到声明它的控制结构的“结束”动作(“如果”,“有”或“范围”),或者扩展到模板的末尾(如果没有这样的控制结构) 。

这是否意味着不存在全局变量(或在整个模板范围内)?还是有一种方法可以定义$url,以便以后可以在模板中重用?

go go-templates
1个回答
0
投票

变量是有作用域的。您在$url{{if}}块内创建了{{else}}变量,因此它们在这些块外不可见。

text/template的打包文档:

变量的范围扩展到声明它的控制结构的“结束”动作(“如果”,“有”或“范围”),或者扩展到模板的末尾(如果没有这样的控制结构) 。

text/template之前创建变量,并使用赋值{{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 Playground

注意:http://true.com<nil> http://false.com<nil> 中添加了使用赋值修改模板变量的功能,因此您需要使用Go 1.11或更高版本来构建应用程序。如果使用的是较旧的版本,则无法修改模板变量的值。

© www.soinside.com 2019 - 2024. All rights reserved.