首頁  >  文章  >  後端開發  >  如何檢查 go template 是否使用了所有模板數據

如何檢查 go template 是否使用了所有模板數據

王林
王林轉載
2024-02-08 22:12:111048瀏覽

如何检查 go template 是否使用了所有模板数据

php小編蘋果在這裡為大家介紹一個有用的技巧,即如何檢查Go Template是否使用了所有模板資料。在開發過程中,有時我們會遇到一些模板資料未被使用的情況,這可能會導致資料渲染不完整或產生不必要的效能損耗。透過以下的方法,我們可以快速檢查並解決這個問題。首先,我們需要了解Go Template的基本語法和使用方法。然後,我們可以使用go tool來解析模板檔案並產生一個AST(抽象語法樹)。透過遍歷這個AST,我們可以找到所有的模板標識符,並與資料來源進行對比,從而確定是否有未使用的模板資料。這個方法簡單而有效,希望對大家有幫助!

問題內容

假設我有一個模板字串

#
today i visited {{ .market }} to buy {{ .fruit }}

提供的模板資料是

map[string]string := { market: "whole foods", fruit: "bananas", veg: "celery" }

我想在這裡感到恐慌,因為模板字串中沒有使用 .veg 。這可能嗎?

我正在使用 go 模板(text/template)。

解決方法

沒有內建支援。您可以分析已解析的模板,但它不必要地複雜。另請注意,這種靜態分析永遠不可能完成:模板可以根據運行時參數存取數據,並且是否使用所有內容只能在運行時決定,並且可能因執行而異(例如,可以使用 索引映射值) {{index .someMap .someKey}} 其中someKey 是運行時提供的值)。

一個可接受的解決方案可能是傳遞一個追蹤哪些元素被存取的資料結構,您可以在範本執行後檢查該情況,如果沒有使用所有內容,則可以執行您想做的任何操作。

例如,此結構追蹤哪些元素尚未存取:

type Params struct {
    m, remaining map[string]string
}

func NewParams(m map[string]string) *Params {
    return &Params{
        m:         m,
        remaining: maps.Clone(m),
    }
}

func (p *Params) Get(key string) string {
    delete(p.remaining, key)
    return p.m[key]
}

使用範例:

const src = `today i visited {{ .Get "market" }} to buy {{ .Get "fruit" }}`
t := template.Must(template.New("").Parse(src))

m := NewParams(
    map[string]string{"market": "whole foods", "fruit": "bananas", "veg": "celery"},
)

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

fmt.Println()
if len(m.remaining) > 0 {
    fmt.Println("Following entries were not used:", m.remaining)
}

這將輸出(在 Go Playground 上嘗試):

today i visited whole foods to buy bananas
Following entries were not used: map[veg:celery]

請注意,我使用了 2 個映射(mremaining)來允許多次存取相同的元素。如果每個元素只能存取一次,那麼簡單的映射(並從該映射中刪除元素)也可以工作。

以上是如何檢查 go template 是否使用了所有模板數據的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除