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

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


{{ 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以便稍后在模板中重复使用?


LEATH
浏览 154回答 1
1回答

ITMISS

变量是作用域的。您在and块内创建$url变量,因此它们在这些块之外不可见。{{if}}{{else}}在 , 之前创建变量{{if}},并使用赋值=而不是声明:=:{{$url := ""}}{{ if . }}&nbsp; &nbsp; {{ $url = "http://true.com" }}{{ else }}&nbsp; &nbsp; {{ $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 或更高版本构建您的应用程序。如果您使用的是旧版本,则无法修改模板变量的值。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go