如何在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