我需要写一个模板,首先定义一些变量,然后在将从模板中生成的变量中使用它们:
{{ 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
,以便以后可以在模板中重用?
变量是有作用域的。您在$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或更高版本来构建应用程序。如果使用的是较旧的版本,则无法修改模板变量的值。