【问题标题】:Implement a for loop inside a Go template在 Go 模板中实现 for 循环
【发布时间】:2020-11-29 13:13:26
【问题描述】:

我在 Go 中工作,现在我需要在一个选择中打印至少 20 个选项,所以我需要使用某种从 0 到 20 的循环(以获取索引)。

如何在 Go 模板中使用 for 循环?

我需要在模板中生成数字序列。我没有要迭代的数组。

编辑: 我需要得到这样的东西:

<select>
     <option value="1">1</option>
     <option value="2">2</option>
     <option value="3">3</option>
     <option value="4">4</option>
</select>

所以,我需要在代码中执行以下操作:

<select>
     {{for i := 1; i < 5; i++}}
        <option value="{{i}}">{{i}}</option>
     {{end}}
</select>

但是,这行不通。

【问题讨论】:

    标签: go-templates


    【解决方案1】:

    您也可以在模板中使用range。见https://golang.org/pkg/text/template/#hdr-Variables

    最简单的选择可能是只使用包含您的选项的切片:

    func main() {
        const tmpl = `
    <select>
    {{range $val := .}}
         <option value="{{$val}}">{{$val}}</option>
    {{end}}
    </select>
    `
        t := template.Must(template.New("tmpl").Parse(tmpl))
    
        t.Execute(os.Stdout, []int{1, 2, 3})
    }
    

    【讨论】:

    • 是的,我已经看过了。但据我了解,范围只是迭代已经创建的数组,我没有任何数组。我需要的是在运行时生成序列
    【解决方案2】:

    最好的办法是在 func_map 中添加一个“迭代”函数。

    template.FuncMap{
            "Iterate": func(count *uint) []uint {
                var i uint
                var Items []uint
                for i = 0; i < (*count); i++ {
                    Items = append(Items, i)
                }
                return Items
            },
    }
    

    使用文本/模板注册函数映射后,您可以像这样进行迭代:

    {{- range $val := Iterate 5 }}
      {{ $val }}
    {{- end }}
    

    我不知道为什么这个有用的功能不是 text/template 提供的默认功能集的一部分。也许他们将来会添加类似的东西。

    【讨论】:

    • 我喜欢你的解决方案,因为我已经在使用 FuncMap 但我得到了can't handle 5 for arg of type *uint。我是编程新手(尤其是指针),除了将计数声明为类型uint 而不是*uint 之外,我不确定如何解决这个问题。你会怎么做才能让它发挥作用?
    • @harperville 您可以使用类型断言。下面为我​​工作` func iterate(count int) []uint { var i uint var Items []uint for i = 0;我
    • @harperville 您传入的值是否有可能是字符串类型?您可能需要一个额外的类似 strtoi 的函数。
    • 令人失望的是,我不记得解决方案是什么。这个项目转瞬即逝,我已经有一段时间没有接触 Go 了!我似乎无法摆脱 Python :)
    猜你喜欢
    • 2019-11-13
    • 1970-01-01
    • 2020-09-15
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 2012-01-07
    • 2021-12-07
    相关资源
    最近更新 更多