Heim > Backend-Entwicklung > Golang > So überprüfen Sie, ob alle Vorlagendaten von go template verwendet werden

So überprüfen Sie, ob alle Vorlagendaten von go template verwendet werden

王林
Freigeben: 2024-02-08 22:12:11
nach vorne
1109 Leute haben es durchsucht

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

PHP-Editor Apple stellt Ihnen hier einen nützlichen Trick vor, nämlich wie Sie überprüfen können, ob Go Template alle Vorlagendaten verwendet. Während des Entwicklungsprozesses kommt es manchmal vor, dass einige Vorlagendaten nicht verwendet werden, was zu einer unvollständigen Datenwiedergabe oder unnötigen Leistungseinbußen führen kann. Mit den folgenden Methoden können wir dieses Problem schnell überprüfen und lösen. Zunächst müssen wir die grundlegende Syntax und Verwendung von Go Template verstehen. Anschließend können wir das Go-Tool verwenden, um die Vorlagendatei zu analysieren und einen AST (Abstract Syntax Tree) zu generieren. Durch das Durchlaufen dieses AST können wir alle Vorlagenidentifikatoren finden und sie mit der Datenquelle vergleichen, um festzustellen, ob ungenutzte Vorlagendaten vorhanden sind. Diese Methode ist einfach und effektiv, ich hoffe, sie wird für alle hilfreich sein!

Frageninhalt

Angenommen, ich habe eine Vorlagenzeichenfolge

today i visited {{ .market }} to buy {{ .fruit }}
Nach dem Login kopieren

Die bereitgestellten Vorlagendaten sind

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

Ich möchte hier in Panik geraten, weil .veg in der Vorlagenzeichenfolge nicht verwendet wird. Ist es möglich?

Ich verwende Go-Vorlagen (text/template). text/template)。

解决方法

没有内置支持。您可以分析已解析的模板,但它不必要地复杂。另请注意,这种静态分析永远不可能完成:模板可以根据运行时参数访问数据,并且是否使用所有内容只能在运行时决定,并且可能因执行而异(例如,可以使用 索引映射值) {{index .someMap .someKey}} 其中 someKey

Workaround

Keine integrierte Unterstützung. Sie können die analysierte Vorlage analysieren, sie ist jedoch unnötig komplex. Beachten Sie auch, dass diese Art der statischen Analyse niemals durchgeführt werden kann: Vorlagen können auf Daten basierend auf Laufzeitparametern zugreifen, und ob alles verwendet werden soll, kann nur zur Laufzeit entschieden werden und kann von Ausführung zu Ausführung variieren (Sie können beispielsweise den Index verwenden). Kartenwert) {{index .someMap .someKey}} wobei someKey der zur Laufzeit bereitgestellte Wert ist).

Eine akzeptable Lösung könnte darin bestehen, eine Datenstruktur zu übergeben, die verfolgt, auf welche Elemente zugegriffen wurde. Sie können dies überprüfen, nachdem die Vorlage ausgeführt wurde, und wenn nicht alles verwendet wird, können Sie tun, was Sie wollen.

Diese Struktur verfolgt beispielsweise, welche Elemente noch nicht besucht wurden:

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]
}
Nach dem Login kopieren
Anwendungsbeispiel:
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)
}
Nach dem Login kopieren

Dies wird ausgegeben (versuchen Sie es auf

Go Playgroundmremaining):

today i visited whole foods to buy bananas
Following entries were not used: map[veg:celery]
Nach dem Login kopieren
🎜Beachten Sie, dass ich zwei Zuordnungen (🎜) verwendet habe, um mehrere Zugriffe auf dasselbe Element zu ermöglichen. Wenn auf jedes Element nur einmal zugegriffen werden kann, funktioniert auch eine einfache Karte (und das Entfernen des Elements aus dieser Karte). 🎜

Das obige ist der detaillierte Inhalt vonSo überprüfen Sie, ob alle Vorlagendaten von go template verwendet werden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage