如何在golang html/template中创建全局变量并在多个位置进行更改?
我正在如何在golang html/template中创建全局变量并在多个位置进行更改?,html,templates,go,go-html-template,Html,Templates,Go,Go Html Template,我正在html/template中创建一个变量,并根据条件更改值。但该值的范围仅保留在if条件内: {{if .UserData}} {{$currentUserId := .UserData.UserId}} [<a href="#ask_question">Inside {{$currentUserId}}</a>] {{else}} {{$currentUserId := 0}} {{end}} [<a href="#ask_quest
html/template
中创建一个变量,并根据条件更改值。但该值的范围仅保留在if
条件内:
{{if .UserData}}
{{$currentUserId := .UserData.UserId}}
[<a href="#ask_question">Inside {{$currentUserId}}</a>]
{{else}}
{{$currentUserId := 0}}
{{end}}
[<a href="#ask_question">outside {{$currentUserId}}</a>]
{{if.UserData}
{{$currentUserId:=.UserData.UserId}
[]
{{else}
{{$currentUserId:=0}
{{end}
[]
在if条件内,我得到了正确的值,但在if条件外,它是0
。如何在条件之外使用$currentUserId
?有人能帮我吗?Go 1.11增加了对的支持。要定义变量,请使用:=
:
{{$currentUserId := 0}}
要更改其值,请使用赋值=
:
{{$currentUserId = .UserData.UserId}}
如果变量是在{{If}
块外部创建的,但在其内部发生了更改,则在{{If}
块之后可以看到更改
{{$currentUserId := 0 -}}
Before: {{$currentUserId}}
{{if .UserData -}}
{{$currentUserId = .UserData.UserId}}
[<a href="#ask_question">Inside {{$currentUserId}}</a>]
{{else}}
{{$currentUserId = 0}}
{{end}}
[<a href="#ask_question">outside {{$currentUserId}}</a>]
输出为(在上尝试):
它首先在没有UserData
的情况下执行模板,然后在UserData
具有UserId=99
的情况下执行模板。输出为:
Current user id: 0
Current user id: 99
Before:
Inside: 0
After: 0
Before: 0
Inside: 99
After: 99
试穿一下
模拟可变变量
您还可以模拟可变变量,但也可以使用已注册的自定义函数。您可以注册一个函数,如SetCurrentUserId()
,该函数将更改变量的值,最好是在传递给模板执行的参数中,这样它就可以安全地同时使用
这是一个如何执行此操作的示例(它使用map
作为模板数据,并且SetCurrentUserId()
将当前用户id设置为此映射中的值):
这再次首先执行没有UserData
的模板,然后执行具有UserId=99
的UserData
模板。输出为:
Current user id: 0
Current user id: 99
Before:
Inside: 0
After: 0
Before: 0
Inside: 99
After: 99
在上试用。也相关/有用:
func main() {
m := map[string]interface{}{}
t := template.Must(template.New("").Funcs(template.FuncMap{
"SetCurrentUserId": func(id int) string {
m["CurrentUserId"] = id
return ""
},
}).Parse(src))
if err := t.Execute(os.Stdout, m); err != nil {
panic(err)
}
m["UserData"] = UserData{99}
if err := t.Execute(os.Stdout, m); err != nil {
panic(err)
}
}
const src = `Before: {{.CurrentUserId}}
{{if .UserData}}
{{SetCurrentUserId .UserData.UserId}}Inside: {{.CurrentUserId}}
{{else}}
{{SetCurrentUserId 0}}Inside: {{.CurrentUserId}}
{{end}}
After: {{.CurrentUserId}}
`
Before:
Inside: 0
After: 0
Before: 0
Inside: 99
After: 99