第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

go - 如何在golang html/template中的多個地方創(chuàng)建全局變量和更改?

go - 如何在golang html/template中的多個地方創(chuàng)建全局變量和更改?

Go
拉丁的傳說 2022-01-04 10:27:41
我正在和中創(chuàng)建一個變量html/template并根據(jù)條件更改該值。但是值的范圍只停留在if條件內(nèi):{{if .UserData}}    {{$currentUserId := .UserData.UserId}}    [<a href="#ask_question">Inside {{$currentUserId}}</a>]{{else}}    {{$currentUserId := 0}}{{end}}[<a href="#ask_question">outside {{$currentUserId}}</a>]在 if 條件內(nèi),我得到了正確的值,但在它之外是0. 如何使用$currentUserId外部條件?有人可以幫我解決這個問題嗎?
查看完整描述

1 回答

?
蠱毒傳說

TA貢獻(xiàn)1895條經(jīng)驗(yàn) 獲得超3個贊

Go 1.11 添加了對更改模板變量值的支持。要定義變量,請使用:=:


{{$currentUserId := 0}}

要更改其值,請使用 assignment =:


{{$currentUserId = .UserData.UserId}}

如果變量是在{{if}}塊外部創(chuàng)建但在塊內(nèi)部更改,則更改將在{{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>]

像這樣測試:


m := map[string]interface{}{}

t := template.Must(template.New("").Parse(src))


m["UserData"] = UserData{99}

if err := t.Execute(os.Stdout, m); err != nil {

    panic(err)

輸出是(在Go Playground上試試):


Before: 0


    [<a href="#ask_question">Inside 99</a>]


[<a href="#ask_question">outside 99</a>]

原答案如下。


簡短的回答是:你不能。


根據(jù)設(shè)計(jì)理念,模板不應(yīng)包含復(fù)雜的邏輯。在模板中,您只能創(chuàng)建新變量,不能更改現(xiàn)有模板變量的值。當(dāng)您{{$currentUserId := .UserData.UserId}}在{{if}}塊內(nèi)執(zhí)行時,會創(chuàng)建一個新變量,該變量會影響外部變量,并且其范圍擴(kuò)展到{{end}}操作。


這在text/template包的變量部分中有描述(同樣適用于html/template包):


變量的范圍擴(kuò)展到聲明它的控制結(jié)構(gòu)(“if”、“with”或“range”)的“結(jié)束”操作,如果沒有這樣的控制結(jié)構(gòu),則擴(kuò)展到模板的末尾。模板調(diào)用不會從其調(diào)用點(diǎn)繼承變量。


可能的解決方法

在您的情況下,最簡單的方法是將自定義函數(shù)注冊CurrentUserId()到您的模板,如果UserData存在,則返回其 id UserData.UserId(),如果不存在,則0按照您的情況返回。


這是一個如何完成的示例:


type UserData struct {

    UserId int

}


func main() {

    m := map[string]interface{}{}

    t := template.Must(template.New("").Funcs(template.FuncMap{

        "CurrentUserId": func() int {

            if u, ok := m["UserData"]; ok {

                return u.(UserData).UserId

            }

            return 0

        },

    }).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 = `Current user id: {{CurrentUserId}}

`

它首先執(zhí)行模板沒有UserData,然后將其與執(zhí)行模板UserData有UserId = 99。輸出是:


Current user id: 0

Current user id: 99

在Go Playground上試試。


模擬可變變量

您還可以模擬可變變量,但也可以使用已注冊的自定義函數(shù)。您可以注冊一個類似的函數(shù)SetCurrentUserId()來改變變量的值,最好是在傳遞給模板執(zhí)行的參數(shù)中,這樣它就可以安全地并發(fā)使用。


這是一個如何做到的示例(它使用 amap作為模板數(shù)據(jù),并將SetCurrentUserId()當(dāng)前用戶 ID 設(shè)置為該地圖中的一個值):


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}}

`

這再次首先執(zhí)行沒有 的模板UserData,然后執(zhí)行UserData具有的模板UserId = 99。輸出是:


Before: 

    Inside: 0

After: 0

Before: 0

    Inside: 99

After: 99

在Go Playground上試試。


查看完整回答
反對 回復(fù) 2022-01-04
  • 1 回答
  • 0 關(guān)注
  • 227 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號