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

问题描述 投票:0回答:1

假设我有一个模板字符串

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

提供的模板数据是

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

我想在这里感到恐慌,因为模板字符串中没有使用

.veg
。这可能吗?

我正在使用 go 模板 (

text/template
)。

go go-templates
1个回答
0
投票

没有内置支持。您可以分析解析后的模板,但它不必要地复杂。

一个可接受的解决方案可能是传递一个跟踪哪些元素被访问的数据结构,您可以在模板执行后检查该情况,如果没有使用所有内容,则可以执行您想做的任何操作。

例如,此结构跟踪哪些元素尚未访问:

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]
© www.soinside.com 2019 - 2024. All rights reserved.