首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在领事模板中重写循环中的变量

在领事模板中重写循环中的变量
EN

Stack Overflow用户
提问于 2016-01-13 08:29:54
回答 3查看 3K关注 0票数 3

我在领事模板中使用了以下模板:

代码语言:javascript
复制
{{ range services }}
  {{ $server_name := .Name | replaceAll "_" "." }}
  {{ range .Tags }}
    {{ if . | regexMatch "server_name=" }}
      # found matching server_name in {{ . }}
      {{ $server_name := . | regexReplaceAll ".*=" "" }}
    {{ end }}
  {{ end }}
  # server_name = {{ $server_name }}
        acl host_{{ .Name }} hdr(host) -i {{ $server_name }}
        use_backend {{ .Name }}_backend if host_{{ .Name }}
{{ end }}

代码语言:javascript
复制
  # found matching server_name in server_name=geoserver.hello.org






  # server_name = geoserver.dev.hello.org
        acl host_geoserver_dev_hello_org hdr(host) -i geoserver.dev.hello.org
        use_backend geoserver_dev_hello_org_backend if host_geoserver_dev_hello_org

其中.Namegeoserver_dev_hello_org,还有一个server_name=geoserver.hello.org标记。我希望到.Tags range循环结束时,$server_name应该有值geoserver.hello.org,但是它仍然具有原始的geoserver.dev.hello.org值。

如何使循环覆盖$server_name (并在找到值时退出循环)?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-01-13 09:23:49

内部$server_name和外部$server_name是不同的变量。您不能在Go模板:http://play.golang.org/p/0fuOmqXrSK中从外部范围设置变量。

您可以尝试重写模板,以便在内部acl中打印if等部分,除非只执行一次,否则会工作。Go模板不是为复杂逻辑设计的脚本语言,而是用于显示预先计算的信息的工具。类固醇的fmt.Printf如果你愿意的话。包括搜索和替换在内的所有逻辑都应该在Go中,它将更快、更安全、更易于维护和调试。

票数 2
EN

Stack Overflow用户

发布于 2017-03-09 21:12:41

consul-template模板中,您可以使用划痕 --一个临时的键值存储,可以在模板的整个生命周期内使用。

您的代码将如下所示:

代码语言:javascript
复制
{{ range services }}
  {{ $server_name := .Name | replaceAll "_" "." }}
  {{ scratch.Set "server_name" $server_name }}
  {{ range .Tags }}
    {{ if . | regexMatch "server_name=" }}
      # found matching server_name in {{ . }}
      {{ $server_name := . | regexReplaceAll ".*=" "" }}
      {{ scratch.Set "server_name" $server_name }}
    {{ end }}
  {{ end }}
  # server_name = {{ scratch.Get "server_name" }}
        acl host_{{ .Name }} hdr(host) -i {{ $server_name }}
        use_backend {{ .Name }}_backend if host_{{ .Name }}
{{ end }}
票数 5
EN

Stack Overflow用户

发布于 2021-02-05 07:12:54

由于Go 1.11发布,可以通过模板内的分配修改变量。所以现在起作用了:

代码语言:javascript
复制
  {{ $v := "init" }}
  {{ if true }}
    {{ $v = "changed" }}
  {{ end }}
  v: {{ $v }} {{/* "changed" */}}

这个版本是介绍到Consul的模板与v0.25.1发行版。

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

https://stackoverflow.com/questions/34761716

复制
相关文章

相似问题

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