如何更新Go模板中的字段值

时间:2016-01-27 09:57:45

标签: templates go struct

我有以下情况,我将包含地图的结构传递给模板:

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}}字段,这样我就可以知道我看过的地图中有多少项。

2 个答案:

答案 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

""