如何在go模板中移动切片?

How to shift slice in go template?

我正在使用 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 中做到这一点(但我不太擅长那种特定的语言),但我找不到如何仅使用模板来做到这一点...

如果您无法在模板外操作 slice/string,并且您也无法向模板添加自定义函数,则您必须在模板内执行此操作。它更冗长,但可行。

一种方法是将两个循环嵌套在一个父循环中。父级将查找您要遗漏的容器,此时它将生成两个子循环,其中 $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