【问题标题】:How to shift slice in go template?如何在 go 模板中移动切片?
【发布时间】:2018-04-27 12:52:30
【问题描述】:

我正在使用confd 通过模板填充文件。

在这个文件中,我想要一个移动和插入的元素列表。 该切片包含类似

的字符串
0=container-1
1=container-2
2=container-3
3=container-4

(其实是我用splitconfd函数拆分的字符串)。 我希望,在每个容器上,能够过滤出容器名称并将列表移动到我的容器首先出现之后的那些。

例如,在container-2 上,我希望得到结果

2=container-3
3=container-4
0=container-1

如何在 confd go 模板中做到这一点?我想我知道如何在 go 中做到这一点(但我在那种特定语言中不是那么好),但我不知道如何只使用模板来做到这一点......

【问题讨论】:

  • 不确定这是否是您要查找的内容play.golang.org/p/EHB-8BZ83o
  • 你所说的'split go template function'到底是什么意思?模板是一种机制,strings.Spit 是另一种机制..
  • @WojciechKaczmarek 在 confd go 模板中有一个 split 函数可用,这是我用来拆分数组的函数
  • @Riduidel 也许,我不知道。当然,split 函数不在模板函数 golang.org/pkg/text/template/#hdr-Functions 的标准库中。我建议您对该函数添加更明确的引用,以便普通读者很快知道它不仅与标准模板有关。然后你会从confd 包的实际用户那里得到更快、更准确的答案。你能引用那个split 的文档吗?
  • 谢谢。现在我们从文档中知道它是相同的模板语言,而且splitstrings.Split 的包装器。然后你可以调整@mkopriva 给你的建议。您只需将split 的结果捕获到一个var,然后使用@mkopriva 示例中的append。看起来它会比重复更短更优雅。

标签: string go slice go-templates confd


【解决方案1】:

如果您无法在模板外部操作切片/字符串,并且如果您无法向模板添加自定义函数,您将不得不在模板内部执行此操作。它更冗长,但可行。

一种方法是将两个循环嵌套在一个父循环内。父级将查找您要遗漏的容器,此时它将产生两个子循环,$i 保存要遗漏的那个的索引。然后第一个子循环可以列出索引大于$i 的容器,第二个子循环将列出索引小于$i 的容器。

{{range $i, $c := $cons}}
    {{/* find item to be skipped */}}
    {{if (eq $c $.Skip)}}

        {{range $j, $c := $cons}}
            {{/* list items that come after the one to be skipped */}}
            {{if (gt $j $i)}}
                {{$c}}
            {{end}}
        {{end}}

        {{range $j, $c := $cons}}
            {{/* list items that come before the one to be skipped */}}
            {{if (lt $j $i)}}
                {{$c}}
            {{end}}
        {{end}}

    {{end}}
{{end}}

https://play.golang.org/p/lGdExfHAvy

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-22
    • 2017-03-12
    • 1970-01-01
    • 2013-06-03
    • 2017-04-24
    • 2014-04-02
    • 1970-01-01
    • 2015-05-21
    相关资源
    最近更新 更多