我是Go的新手,我正在努力寻找一种方法从Go模板语言中返回数组中的唯一变量。这是配置一些软件,我没有访问源来改变实际程序只有模板。
我在Go游乐场中敲了一个例子:
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
我真的被困了,因为我知道几乎没有去努力在文档中找到任何数组操作方法。任何人有任何提示吗?
很抱歉不清楚我在上班途中在公交车上写了这个问题。
我无法访问模板外的任何转码。我有一个模板,我可以编辑,在该模板中,我有一个数组,可能有也可能没有多个值,我需要打印一次。
我很欣赏这不是模板的工作原理,但是如果有一些肮脏的方法可以做到这一点,那么这将节省我几天的工作。
答案 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
..但这会给你基本的想法)
那就是说 - 您是否考虑过滤模板外的 ?这会让你的事情变得更好......然后你可以迭代模板中的实际切片。
答案 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