2015-03-07 18 views
5

Döngü özel işlev olarak kullanmaya çalışıyorum. Kıvrımlı parantezler arasında yineleme ve içeriklerin sayısını alır, daha sonra içerikler köşeli ayraçlar arasında yinelenmelidir. , Bakınız örnek:Golang. Html/template package kullanarak döngü işlevi nasıl oluşturulur

main.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}} 

Çıktı

<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> 

Uygulanması mümkün mü? Motivasyon, text/template'un standart işlevselliğinin sadece küme parantezi arasındaki içeriğin yinelenmesine izin vermemesidir. Evet, "dış" verilerden geçen range eylemi ile yapabiliriz.

cevap

9

Bir dilim döndüren bir işlevde range kullanabilirsiniz. http://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) 
} 
+0

İyi fikir! Böylece, küme parantezlerinden içerik almanın bir yolu yok mu?) –

+0

Farkında olduğumdan değil. – Innominate

+2

Dilim elemanlarını kullanmıyorsanız, boş bir yapı kullanmak daha verimlidir. http://play.golang.org/p/_jRV62bOB3 Bu şekilde, n öğeleri yerine yalnızca bir dilim başlığı (sabit boyut) ayırırsınız. – Logiraptor