使用Go模板生成Go模板

4
我希望使用Go模板生成类似{{ .Values.something }}的内容。但我无法确定模板应该是什么样子,例如,我考虑了下面这个模板:
`"{{.Values."{{ .Value }}"}}"`

并将其用于这个结构体

type values struct {
    Value string
}

但这并没有起作用,我尝试了其他一些组合,但没有运气。有人可以帮助我弄清楚如何从go模板中获得{{ .Values.something }}这个输出吗。

1个回答

2

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}}

{{"{{.Values."}}{{.Value}}{{"}}"}}

请在Go Playground上试用。

您还可以使用print内置模板函数一步完成所有操作:

{{ print "{{.Values." .Value "}}" }}

请在Go Playground上尝试此代码。
II. 更改默认分隔符
我们需要使用模板生成模板,因此需要进行上述模板技巧,以便两个模板使用相同的分隔符。
如果我们更改生成器模板的分隔符,则任务变得更加简单。可以使用Template.Delims()方法更改分隔符。
例如,如果我们将左右分隔符从({{}})更改为(<<>>),则序列{{}}不再是特殊字符,可以在模板中使用,并且它们将按原样输出。
因此,以下简单模板也可以实现您想要的效果:
{{ .Values.<<.Value>> }}

使用自定义分隔符的示例:

t := template.Must(template.New("").
    Delims("<<", ">>").
    Parse(`{{ .Values.<<.Value>> }}`))

Go Playground上尝试这个。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接