2012-05-25 9 views
6

私はgoのテンプレートシステムを使ってこのような文字列を書こうとしています: (p1、p2、p3)、p1、p2、.. 。プログラムの配列から来ます。私の問題は、最後の(または最初の)要素に対してカンマを適切に配置する方法です。Google Goのテキストテンプレートの範囲の最後の要素の特別な扱い

出力は(P1、P2、P3、)このようになります私の非作業バージョン:

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}})` 

私の最高の手がかりは、これまで、ここでhttp://golang.org/pkg/text/template/次の文で発見された:

場合は、 "range"アクションは変数を初期化し、変数は反復の連続する要素に設定されます。また、「範囲」は、コンマで区切られた2つの変数を宣言してもよい:ケース$インデックスと$要素がアレイ/スライスインデックスの連続する値に設定するか、キーと要素のマップされた

$index, $element := pipeline 

それぞれ、変数が1つしかない場合、要素に割り当てられます。これは、Goの範囲節の規約とは逆です。インデックス

これは、それが繰り返しで、インデックスのホールドを取得することが可能ですが、私はちょうど2つの変数とテンプレートでその変数を宣言する範囲を意味しているかを把握することができないことを示唆していることを示唆しています 宣言されるはずです。

答えて

8

go-nutsメーリングリストのthis exampleを参照してください。このトリックの1つの鍵は、テンプレートifがGo言語ifと異なることです。ブール値を必要とするGo言語とは異なり、テンプレートはゼロの値をテストできます。次に、魔法は{{if $index}},{{end}}です。ここでは、$ indexはその割り当ての外観以外の宣言を必要としません。

+0

ありがとうございました。それはそれを解決しました! – Laserallan

関連する問題