我需要编写一个模板,在其中首先定义一些变量,然后将它们用于从模板生成的内容中:{{ 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"阅读文档,我看到了变量的范围扩展到声明它的控制结构(“if”、“with”或“range”)的“结束”操作,如果没有这样的控制结构,则扩展到模板的末尾。这是否意味着没有全局(或整个模板的范围)变量?或者有没有一种方法可以定义$url以便稍后在模板中重复使用?
1 回答
ITMISS
TA贡献1871条经验 获得超8个赞
变量是作用域的。您在and块内创建$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 Playground上试试):
http://true.com<nil>
http://false.com<nil>
注意:使用赋值修改模板变量是在Go 1.11中添加的,因此您需要使用 Go 1.11 或更高版本构建您的应用程序。如果您使用的是旧版本,则无法修改模板变量的值。
- 1 回答
- 0 关注
- 153 浏览
添加回答
举报
0/150
提交
取消