How to update field value in a Go template -
i have following case, passing struct containing map template:
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() { := 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) } } i increment count field of codec can know how many items of map i've seen.
you can define method on struct:
type codec struct { names map[string]string count int } func (c *codec) incandget() int { c.count++ return c.count } calling template:
c := &codec{count: 2} t := template.must(template.new("").parse(`{{.incandget}} {{.incandget}}`)) t.execute(os.stdout, c) output (try on go playground):
3 4 note work, method needs pointer receiver (func (c *codec) incandget()) , have pass pointer template.execute() (c pointer in our example: c := &codec{count: 2}).
if don't want result counting, define have string return type , return empty string "":
func (c *codec) inc() string { c.count++ return "" }
Comments
Post a Comment