2012-05-25 6 views
6

Próbuję napisać łańcuch wyglądający w ten sposób za pomocą go systemu szablonów: (p1, p2, p3), gdzie p1, p2, .. pochodzi z tablicy w programie. Mój problem polega na tym, jak prawidłowo wstawić przecinek do ostatniego (lub pierwszego) elementu.Specjalna obróbka przypadku dla ostatniego elementu zakresu w szablonach tekstowych Google Go

Moja non wersja robocza, która wyprowadza (P1, P2, P3) wygląda następująco:

package main 

import "text/template" 
import "os" 
func main() { 
    ip := []string{"p1", "p2", "p3"} 
    temp := template.New("myTemplate") 
    temp,_ = temp.Parse(paramList) 
    temp.Execute(os.Stdout, ip) 

} 

const paramList = 
`{{ $i := . }}({{ range $i }}{{ . }}, {{end}})` 

Mój najlepszy clue tej pory stwierdzono tu http://golang.org/pkg/text/template/ w następującym stwierdzeniem:

jeśli Operacja "zasięg" inicjuje zmienną, zmienna jest ustawiana na kolejne elementy iteracji. Ponadto, „zakres” może zadeklarować dwie zmienne, oddzielonych przecinkami:

$index, $element := pipeline 

w tym przypadku $ indeksu i $ elementem są ustawione na kolejnych wartości tablicy/index plaster lub klucz i elementem map , odpowiednio. Zauważ, że jeśli istnieje tylko jedna zmienna, to jest ona przypisana do elementu; jest to sprzeczne z konwencją w klauzulach Go range. gdzie to sugeruje, że indeks

To sugeruje, że jest to możliwe, aby zdobyć indeks w iteracji, ale po prostu nie może dowiedzieć się, co rozumie się zakres deklarując dwie zmienne i gdzie w szablonie te zmienne powinny zostać zadeklarowane.

Odpowiedz

8

Zobacz this example z listy mailingowej orzechów. Jednym kluczem do tej sztuczki jest to, że szablon if jest inny niż język Go if. Szablon może testować wartość zero, w przeciwieństwie do języka Go wymagającego wartości boolowskiej. Magia jest wtedy {{if $index}},{{end}}, gdzie $ index nie wymaga deklaracji poza jej pojawieniem się w zadaniu.

+0

Dzięki. To rozwiązało! – Laserallan

Powiązane problemy