2014-11-29 15 views
5

Sto cercando di eseguire il loop su un array con i modelli Go e voglio aggiungere una stringa in più all'ultima voce del ciclo.Vai all'alternativa per python loop.last

in Python, posso fare

{% for host in hosts %} 
{{ host }}{% if loop.last %} ;{% endif %} 
{% endfor %} 

cercando di raggiungere stessa cosa con Go, qui di seguito è il frammento di equivalente Go.

{{ range $host := $hosts }} 
{{$host}} 
{{ end }} 

Grazie.

risposta

2

Se l'elenco non è vuoto, il frammento Python stampa un punto e virgola dopo l'ultimo elemento. È possibile ottenere lo stesso risultato in Vai circondando l'intervallo con un se per verificare se c'è almeno un elemento nella sezione e la stampa; fuori dal giro.

{{if $hosts}}{{range $host := $hosts}} 
{{$host}} 
{{ end }} ;{{end}} 

Questo snippet funziona perché si sta aggiungendo alla fine dell'ultimo elemento. Una soluzione più generale richiede una funzione modello personalizzata. Ecco un esempio di funzione:

func last(v interface{}, i int) (bool, error) { 
    rv := reflect.ValueOf(v) 
    if rv.Kind() != reflect.Slice { 
    return false, errors.New("not a slice") 
    } 
    return rv.Len()-1 == i, nil 
} 

ed ecco come usarlo nel modello:

{{range $i, $host := $hosts }} 
{{$host}}{{if last $hosts $i}} ;{{end}} 
{{ end }} 

ho postato un a working example of the custom function al parco giochi.

-1

pongo2 mira a supportare la sintassi di template Django (che è simile a quella di Jinja2). Il tuo codice modello funzionerà su pongo2 con un leggero cambiamento; vedi this example nel parco giochi.