如何在不尝试存储的情况下验证 golang 中的模板?

问题描述

假设我正在尝试从数据源读取和存储模板, 但是很少有不好的模板:

例如:一个好的 golang 模板 - "Paid {{.AMOUNT}} to {{.PERSON}}"

vs: 坏 - "Paid {{.AMOUNT}} to {.PERSON"

在存储之前,我想检查它是否是一个有效的 golang 模板。 无论如何我可以做到,而无需实际尝试渲染它们?

解决方法

您可以解析模板的文本以检查其语法是否正确。要做到这一点:

func valid(s string) bool {
    _,err := template.New("").Parse(s)
    return err == nil
}

测试:

fmt.Println(valid(`Paid {{.AMOUNT}} to {{.PERSON}}`))
fmt.Println(valid(`{{`))

哪些输出(在 Go Playground 上试试):

true
false

请注意,这当然并不意味着您在尝试执行模板时不会出错。当然,这也取决于你传递给执行的参数是什么。

另请注意,您的第二个模板 "Paid {{.AMOUNT}} to {.PERSON" 在语法上是正确的。使用单个花括号 { 不是错误,它会被添加到输出中。