首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用go模板生成go模板

使用go模板生成go模板
EN

Stack Overflow用户
提问于 2020-01-04 15:09:18
回答 1查看 252关注 0票数 4

我想使用go模板生成类似{{ .Values.something }}的东西。

但是我不知道我的模板应该是什么样子,例如,我想了一个这样的模板

代码语言:javascript
运行
复制
`"{{.Values."{{ .Value }}"}}"`

并对此结构执行它

代码语言:javascript
运行
复制
type values struct {
    Value string
}

但它不起作用,我也尝试了一些其他组合,但没有运气。有人能帮我弄清楚如何从go模板中获取{{ .Values.something }}输出吗?

EN

回答 1

Stack Overflow用户

发布于 2020-01-04 15:55:36

I.不更改定界符

您不能在另一个{{ }}操作中嵌入{{ }}操作,这就是您尝试过的。由于模板中的{{}}文字是特殊的(它们是默认的分隔符),您必须使用一个操作将这些文字输出为文字,例如

代码语言:javascript
运行
复制
{{ "{{" }}

代码语言:javascript
运行
复制
{{ "}}" }}

因此,一个可行的解决方案:

代码语言:javascript
运行
复制
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上试用):

代码语言:javascript
运行
复制
{{ .Values.Something }}

当然,您也可以使用以下模板通过一个操作输出{{.Values

代码语言:javascript
运行
复制
{{"{{.Values."}}{{.Value}}{{"}}"}}

Go Playground上试试。

您还可以使用print内置模板函数在一个步骤中完成所有这些操作:

代码语言:javascript
运行
复制
{{ print "{{.Values." .Value "}}" }}

Go Playground上试试这个。

II.通过更改默认定界符

上面所有的模板功夫都是必需的,因为我们使用了一个模板来生成一个模板,该模板使用了相同的分隔符。

如果我们改变生成器模板的分隔符,我们的任务就会变得简单得多。可以使用Template.Delims()方法更改分隔符。

因此,对于examle,如果我们将左右定界符从({{}})更改为(<<>>),那么序列{{}}就不再特殊了,它可以用在模板中,它们将按原样输出。

因此,下面这个简单的模板也将完成您想要的操作:

代码语言:javascript
运行
复制
{{ .Values.<<.Value>> }}

使用它并更改默认分隔符的示例:

代码语言:javascript
运行
复制
t := template.Must(template.New("").
    Delims("<<", ">>").
    Parse(`{{ .Values.<<.Value>> }}`))

Go Playground上试试这个。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59588692

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档