我有以下情况,我将包含地图的结构传递给模板:
Price High to Low
我想增加package main
import (
"log"
"os"
"text/template"
)
var fns = template.FuncMap{
"plus1": func(x int) int {
return x + 1
},
}
type codec struct {
Names map[string]string
Count int
}
func main() {
a := map[string]string{"one": "1",
"two": "2",
"three": "3"}
t := template.Must(template.New("abc").Funcs(fns).Parse(`{{$l := len .Names}}{{range $k, $v := .Names}}{{if ne (plus1 $.Count) $l}}{{$k}} {{$v}} {{end}}{{end}}.`))
err := t.Execute(os.Stdout, codec{a, 0})
if err != nil {
log.Println(err)
}
}
的{{1}}字段,这样我就可以知道我看过的地图中有多少项。
答案 0 :(得分:2)
一种解决方案是使plus1
函数成为一个闭包,直接作用于codec
的值:
// first create a codec instance
c := codec {a, 0}
// now define the function as a closure with a reference to c
fns := template.FuncMap{
"plus1": func() int {
c.Count++
return c.Count
},
}
// now we don't need to pass anything to it in the template
t := template.Must(template.New("abc").Funcs(fns).Parse(`{{$l := len .Names}}{{range $k, $v := .Names}}{{if ne (plus1) $l}}{{$k}} {{$v}} {{end}}{{end}}.`))
输出结果为:
one 1 three 3
我猜你的目标是什么?并且该值在执行结束时保留在c
中。
答案 1 :(得分:1)
您只需在结构上定义一个方法:
type codec struct {
Names map[string]string
Count int
}
func (c *codec) IncAndGet() int {
c.Count++
return c.Count
}
从模板中调用它:
c := &codec{Count: 2}
t := template.Must(template.New("").Parse(`{{.IncAndGet}} {{.IncAndGet}}`))
t.Execute(os.Stdout, c)
输出(在 Go Playground 上试试):
3 4
请注意,要使其工作,该方法需要一个指针接收器(func (c *codec) IncAndGet()
),您必须将指针传递给Template.Execute()
(c
是我们示例中的指针:{ {1}})。
如果您不想要计算任何结果,请将其定义为c := &codec{Count: 2}
返回类型并返回空string
string
:
""