我想使用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
复制相似问题