Maison  >  Article  >  développement back-end  >  Comment vérifier si toutes les données du modèle sont utilisées par go template

Comment vérifier si toutes les données du modèle sont utilisées par go template

王林
王林avant
2024-02-08 22:12:111050parcourir

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

Éditeur PHP Apple est là pour vous présenter une astuce utile, à savoir comment vérifier si Go Template utilise toutes les données du modèle. Au cours du processus de développement, nous rencontrons parfois des situations dans lesquelles certaines données du modèle ne sont pas utilisées, ce qui peut entraîner un rendu incomplet des données ou une perte de performances inutile. Grâce aux méthodes suivantes, nous pouvons rapidement vérifier et résoudre ce problème. Tout d’abord, nous devons comprendre la syntaxe de base et l’utilisation de Go Template. Nous pouvons ensuite utiliser l'outil go pour analyser le fichier modèle et générer un AST (Abstract Syntax Tree). En parcourant cet AST, nous pouvons trouver tous les identifiants de modèle et les comparer avec la source de données pour déterminer s'il existe des données de modèle inutilisées. Cette méthode est simple et efficace, j'espère qu'elle sera utile à tout le monde !

Contenu de la question

Supposons que j'aie une chaîne de modèle

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

Les données du modèle fournies sont

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

Je veux paniquer ici car .veg n'est pas utilisé dans la chaîne du modèle. Est-il possible?

J'utilise des modèles Go (text/template). text/template)。

解决方法

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

Solution de contournement

Pas de support intégré. Vous pouvez analyser le modèle analysé, mais c'est inutilement complexe. Notez également que ce type d'analyse statique ne peut jamais être effectué : les modèles peuvent accéder aux données en fonction des paramètres d'exécution, et l'opportunité de tout utiliser ne peut être décidée qu'au moment de l'exécution et peut varier d'une exécution à l'autre (par exemple, vous pouvez utiliser l'index map value) {{index .someMap .someKey}}someKey est la valeur fournie lors de l'exécution).

Une solution acceptable pourrait être de transmettre une structure de données qui suit les éléments auxquels vous avez accédé, vous pouvez vérifier qu'une fois le modèle exécuté et si tout n'est pas utilisé, vous pouvez faire ce que vous voulez.

Par exemple, cette structure garde une trace des éléments qui n'ont pas encore été visités :

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]
}
Exemple d'utilisation :
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)
}

Cela affichera (essayez-le sur

Go Playgroundmremaining) :

today i visited whole foods to buy bananas
Following entries were not used: map[veg:celery]
🎜Notez que j'ai utilisé 2 mappages (🎜) pour permettre des accès multiples au même élément. Si chaque élément n'est accessible qu'une seule fois, alors une simple carte (et supprimer l'élément de cette carte) fonctionnera également. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer