我想使用go模板生成类似{{ .Values.something }}的东西。
但是我不知道我的模板应该是什么样子,例如,我想了一个这样的模板
`"{{.Values."{{ .Value }}"}}"`并对此结构执行它
type values struct {
Value string
}但它不起作用,我也尝试了一些其他组合,但没有运气。有人能帮我弄清楚如何从go模板中获取{{ .Values.something }}输出吗?
发布于 2020-01-04 15:55:36
I.不更改定界符
您不能在另一个{{ }}操作中嵌入{{ }}操作,这就是您尝试过的。由于模板中的{{和}}文字是特殊的(它们是默认的分隔符),您必须使用一个操作将这些文字输出为文字,例如
{{ "{{" }}和
{{ "}}" }}因此,一个可行的解决方案:
t := template.Must(template.New("").Parse(`{{"{{"}} .Values.{{.Value}} {{"}}"}}`))
buf := &bytes.Buffer{}
params := map[string]interface{}{
"Value": "Something",
}
if err := t.Execute(buf, params); err != nil {
panic(err)
}
fmt.Println(buf.String())以下输出(在Go Playground上试用):
{{ .Values.Something }}当然,您也可以使用以下模板通过一个操作输出{{和.Values:
{{"{{.Values."}}{{.Value}}{{"}}"}}在Go Playground上试试。
您还可以使用print内置模板函数在一个步骤中完成所有这些操作:
{{ print "{{.Values." .Value "}}" }}在Go Playground上试试这个。
II.通过更改默认定界符
上面所有的模板功夫都是必需的,因为我们使用了一个模板来生成一个模板,该模板使用了相同的分隔符。
如果我们改变生成器模板的分隔符,我们的任务就会变得简单得多。可以使用Template.Delims()方法更改分隔符。
因此,对于examle,如果我们将左右定界符从({{,}})更改为(<<,>>),那么序列{{和}}就不再特殊了,它可以用在模板中,它们将按原样输出。
因此,下面这个简单的模板也将完成您想要的操作:
{{ .Values.<<.Value>> }}使用它并更改默认分隔符的示例:
t := template.Must(template.New("").
Delims("<<", ">>").
Parse(`{{ .Values.<<.Value>> }}`))在Go Playground上试试这个。
https://stackoverflow.com/questions/59588692
复制相似问题