首页 > 后端开发 > Golang > 如何检查 go template 是否使用了所有模板数据

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

王林
发布: 2024-02-08 22:12:11
转载
1105 人浏览过

如何检查 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)。text/template)。

解决方法

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

解决方法

没有内置支持。您可以分析已解析的模板,但它不必要地复杂。另请注意,这种静态分析永远不可能完成:模板可以根据运行时参数访问数据,并且是否使用所有内容只能在运行时决定,并且可能因执行而异(例如,可以使用 索引映射值) {{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 Playgroundmremaining 上尝试):

today i visited whole foods to buy bananas
Following entries were not used: map[veg:celery]
登录后复制
🎜请注意,我使用了 2 个映射(🎜)来允许多次访问相同的元素。如果每个元素只能访问一次,那么简单的映射(并从该映射中删除元素)也可以工作。🎜

以上是如何检查 go template 是否使用了所有模板数据的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:stackoverflow.com
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板