【问题标题】:Golang. How to create loop function using html/template package戈朗。如何使用 html/template 包创建循环函数
【发布时间】:2015-05-09 03:56:51
【问题描述】:

我正在尝试将循环实现为自定义函数。它需要大括号之间的迭代次数和内容,然后它应该迭代括号之间的内容 n 次。请看示例:

ma​​in.go

template.Must(template.ParseFiles("palette.html")).Funcs(template.FuncMap{
        "loop": func(n int, content string) string {
            var r string
            for i := 0; i <= n; i++ {
                r += content
            }
            return r
        },
    }).ExecuteTemplate(rw, index, nil)

index.html

{{define "index"}}
<div class="row -flex palette">
  {{loop 16}}
    <div class="col-2"></div>
  {{end}}
</div>
{{end}}

输出

<div class="row -flex palette">
    <div class="col-2"></div>
    <div class="col-2"></div>
    <div class="col-2"></div>
    <div class="col-2"></div>
    ... 16 times
</div>

可以实现吗?动机是text/template 的标准功能不允许仅在大括号之间迭代内容。是的,我们可以通过range 操作通过“外部”数据来实现。

【问题讨论】:

    标签: templates go


    【解决方案1】:

    您可以在返回切片的函数上使用rangehttp://play.golang.org/p/FCuLkEHaZn

    package main
    
    import (
        "html/template"
        "os"
    )
    
    func main() {
        html := `
    <div class="row -flex palette">
      {{range loop 16}}
        <div class="col-2"></div>
      {{end}}
    </div>`
        tmpl := template.Must(template.New("test").Funcs(template.FuncMap{
            "loop": func(n int) []struct{} {
                return make([]struct{}, n)
            },
        }).Parse(html))
        tmpl.Execute(os.Stdout, nil)
    }
    

    【讨论】:

    • 好主意!因此没有办法从大括号中获取内容?)
    • 如果不使用切片元素,使用空结构会更有效。 play.golang.org/p/_jRV62bOB3 这样你只分配一个切片头(恒定大小)而不是 n 个元素。
    • 是的!你是绝对正确的!)@Innominate,请更新你的答案。
    猜你喜欢
    • 2022-01-16
    • 2017-01-29
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-04
    • 1970-01-01
    相关资源
    最近更新 更多