【问题标题】:Golang Templates - Update and Print Counter VariableGolang 模板 - 更新和打印计数器变量
【发布时间】:2021-12-12 09:27:50
【问题描述】:

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

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

我在这里做错了什么?

去游乐场链接: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)
}

【问题讨论】:

    标签: go templates variables counter


    【解决方案1】:

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

    test:3:21:在 <.numbers> 处执行“测试”:无法评估 int 类型的字段 Numbers

    始终处理错误!

    问题在于{{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}} 的内容被跳过,因为条件评估为假(在模板条件中 0 为假)。通过删除 {{with}} 指令进行修复。不需要。

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

    【讨论】:

    • 使用您的第二个解决方案,是否不再需要 $ 之前的 .Numbers,因为我们没有 {{with $i := 0}} 设置 .0 了?
    • @Sam 是的,.Numbers 在第二个模板中工作。另请参阅我最近对答案的编辑。
    猜你喜欢
    • 1970-01-01
    • 2018-10-12
    • 1970-01-01
    • 1970-01-01
    • 2016-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多