如何使用Go的文本/模板包返回数组中的唯一元素?

时间:2014-11-11 21:29:46

标签: go

我是Go的新手,我正在努力寻找一种方法从Go模板语言中返回数组中的唯一变量。这是配置一些软件,我没有访问源来改变实际程序只有模板。

我在Go游乐场中敲了一个例子:

https://play.golang.org/

package main

import "os"
import "text/template"

func main() {

      var arr [10]string
      arr[0]="mice"
      arr[1]="mice"
      arr[2]="mice"
      arr[3]="mice"
      arr[4]="mice"
      arr[5]="mice"
      arr[6]="mice"
      arr[7]="toad"
      arr[8]="toad"
      arr[9]="mice"

      tmpl, err := template.New("test").Parse("{{range $index, $thing := $}}The thing is: {{$thing}}\n{{end}}")
      if err != nil { panic(err) }
      err = tmpl.Execute(os.Stdout, arr)
      if err != nil { panic(err) }

}

现在返回:

The thing is: mice
The thing is: mice
The thing is: mice
The thing is: mice
The thing is: mice
The thing is: mice
The thing is: mice
The thing is: toad
The thing is: toad
The thing is: mice

我要做的是制作一个模板,该模板来自输入数组过滤重复项并且仅返回:

The thing is: mice
The thing is: toad

我真的被困了,因为我知道几乎没有去努力在文档中找到任何数组操作方法。任何人有任何提示吗?

Addenium

很抱歉不清楚我在上班途中在公交车上写了这个问题。

我无法访问模板外的任何转码。我有一个模板,我可以编辑,在该模板中,我有一个数组,可能有也可能没有多个值,我需要打印一次。

我很欣赏这不是模板的工作原理,但是如果有一些肮脏的方法可以做到这一点,那么这将节省我几天的工作。

2 个答案:

答案 0 :(得分:3)

您可以通过template.FuncMap

为模板创建自己的功能
arr := []string{
    "mice",
    "mice",
    "mice",
    "mice",
    "mice",
    "mice",
    "mice",
    "toad",
    "toad",
    "mice",
}

customFunctions := template.FuncMap{"unique" : unique}

tmpl, err := template.New("test").Funcs(customFunctions).Parse("{{range $index, $thing := unique $}}The thing is: {{$thing}}\n{{end}}")

unique定义为:

func unique(e []string) []string {
    r := []string{}

    for _, s := range e {
        if !contains(r[:], s) {
            r = append(r, s)
        }
    }
    return r
}

func contains(e []string, c string) bool {
    for _, s := range e {
        if s == c {
            return true
        }
    }
    return false
}

输出:

The thing is: mice
The thing is: toad

(最好使用map ..但这会给你基本的想法)

那就是说 - 您是否考虑过滤模板外的 ?这会让你的事情变得更好......然后你可以迭代模板中的实际切片。

工作样本:https://play.golang.org/p/L_8t10CpHW

答案 1 :(得分:0)

模板可以访问特定的自定义函数http://golang.org/pkg/text/template/#FuncMap。这允许从模板中调用您自己的逻辑。

文档中有一个全面的例子,我在这里不再重复。关键是设置一个功能图并将其提供给模板:

 tmpl, err := template.New("titleTest").Funcs(funcMap).Parse(templateText)

然后可以在模板中访问。

 {{myCustomFuction .}}

从现在开始确定它将需要更多的代码以映射函数的形式来实现,我想我会分享一个可能完成工作的想法。如果您可以控制哪个模板“去”'程序你无法修改运行,那么你可以进行多次通过。我也假设你在Linux上。像这样:

goexe 'first template'    // this writes to 'text file'
cat textfile | sort | uniq > 'text file'
goexe 'second template'   // your desired output