Golang 模板 - 更新和打印计数器变量

Golang Templates - Update and Print Counter Variable

我正在尝试在遍历嵌套 for 循环时更新和打印 Go 模板内的计数器变量。

不是试图在循环时打印我的任一数据结构的索引。我不打算打印每个数据结构中的每个对象,我希望这个计数器变量仅在相等语句为真时递增。

我做错了什么?

去游乐场link:https://play.golang.org/p/RsuEk1PqZ7a

type a struct {
    Numbers []string
    Letters []string
}

var data = &a{
    Numbers: []string{"one", "two"},
    Letters: []string{"a","b","b", "c"},
}

var tmplSrc = `start
{{with $i := 0}}
  {{range $number := .Numbers}}
    {{range $letter := .Letters}}
      {{if eq $letter "b"}}
        {{$i = add $i 1}}
        {{$i}}
      {{end}}
    {{end}}
  {{end}}
{{end}}
fin
`

func main() {
    funcMap := template.FuncMap{
        "add": func(a int, b int) int {
            return a + b
        },
    }
    tmpl := template.Must(template.New("test").Funcs(funcMap).Parse(tmplSrc))
    tmpl.Execute(os.Stdout, data)
}

tmpl.Execute 执行返回的错误提示问题:

test:3:21: executing "test" at <.Numbers>: can't evaluate field Numbers in type int

始终处理错误!

问题是 {{with $i := 0}}. 设置为 0。该模板期望 . 成为模板的数据参数。通过使用 $ 来引用数据参数来修复。 .Letters 需要进行类似的更改,因为 {{range}} 还设置了 ..

{{with $i := 1}}
  {{range $number := $.Numbers}}
    {{range $letter := $.Letters}}
    {{if eq $letter "b"}}
      {{$i = add $i 1}}
      {{$i}}
    {{end}}
    {{end}}
  {{end}}
{{end}}

我用{{with $i := 1}}来匹配操场上的代码。该题使用{{with $i := 0}}。问题中的代码引入了另一个问题: {{with}} 的内容被跳过,因为条件的计算结果为 false(0 在模板条件中为 false)。通过删除 {{with}} 指令进行修复。不需要。

{{$i := 0}}
{{range $number := $.Numbers}}
  {{range $letter := $.Letters}}
    {{if eq $letter "b"}}
      {{$i = add $i 1}}
        {{$i}}
     {{end}}
  {{end}}
{{end}}