テンプレート範囲内の最後の項目の検出
Go テンプレートでは、範囲アクションを使用して配列またはスライスを反復処理すると、次の項目に簡単にアクセスできます。配列要素。ただし、場合によっては、最後の反復を他の反復と区別することが必要になります。
範囲内の最後の要素に個別の書式設定を必要とするテンプレートを検討してください。
{{range $i, $e := .SomeField}} {{if $i}}, {{end}} $e.TheString {{end}}
このテンプレートは出力を生成します。 like:
one, two, three
この動作を変更し、最後の前に「and」を出力するにはelement:
one, two, and three
範囲内のどの要素が最後であるかを判断する必要があります。
テンプレートの外側で配列の長さを追跡することは可能ですが、このメソッドでは配列の長さの変化を考慮しない静的な値です。
解決策は、テンプレートに対する Go の関数インジェクション機能を活用することです。カスタム関数を定義することで、最後の要素を動的に識別することが可能になります。
package main import ( "os" "reflect" "text/template" ) var fns = template.FuncMap{ "last": func(x int, a interface{}) bool { return x == reflect.ValueOf(a).Len() - 1 }, } func main() { t := template.Must(template.New("abc").Funcs(fns).Parse(`{{range $i, $e := .}}{{if $i}}, {{end}}{{if last $i $}}and {{end}}{{$e}}{{end}}.`)) a := []string{"one", "two", "three"} t.Execute(os.Stdout, a) }
このアプローチでは、リフレクションを利用して配列の長さを動的に決定し、現在のインデックス $i と比較します。インデックスが配列の長さから 1 を引いた値と一致する場合、last 関数は true を返し、現在の要素が範囲内の最後であることを示します。
代わりに、リフレクションなしで len 関数を使用することもできます。
package main import ( "os" "text/template" ) func main() { t := template.Must(template.New("abc").Parse(`{{range $i, $e := .}}{{if $i}}, {{end}}{{if len .}}and {{end}}{{$e}}{{end}}.`)) a := []string{"one", "two", "three"} t.Execute(os.Stdout, a) }
以上がGo テンプレート範囲内の最後の項目を検出するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。