On Sun, Apr 7, 2019 at 6:19 PM Amit Saha <[email protected]> wrote: > > I am seeing (what I think) a somewhat confusing behavior which I am not sure > I understand. The working code example is at > https://play.golang.org/p/GEqT4MiZQnq > > > Basically, I have a map which I am iterating over in a template: > > > m := map[int]string{ > 1: "\"Hello\"\n", > 2: "\"World\"\n", > } > > > funcMap := template.FuncMap{ > "testFunc": testFunc, > } > > > tmpl := template.New("test").Funcs(funcMap) > tmpl, err := tmpl.Parse(` > > > {{ range . }}{{. | testFunc}}{{end}} > `) > if err != nil { > log.Fatal("Error parsing template: ", err) > > > } > > > As you can see, I am not using the range $k, $v .. pattern to iterate over > the map. But just using the generic "." pattern. My expectation here was that > it would be iterating over the map's > > keys. However, it seems to be correctly doing what I wanted to do here, which > is iterate over the values. How does that work?
That's how the text/template package works. Quoting https://golang.org/pkg/text/template: If a "range" action initializes a variable, the variable is set to the successive elements of the iteration. Also, a "range" may declare two variables, separated by a comma: range $index, $element := pipeline in which case $index and $element are set to the successive values of the array/slice index or map key and element, respectively. Note that if there is only one variable, it is assigned the element; this is opposite to the convention in Go range clauses. Ian -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
