テンプレート範囲内の最後の要素の検出
Golang テキスト テンプレートでは、range ディレクティブはコレクション内の要素を反復処理し、次の要素へのアクセスを提供します。現在の要素とそのインデックス。このメカニズムは効率的なループを促進しますが、シーケンス内の最後の要素を識別するときに課題が生じます。
問題:
テンプレートを検討してください:
{{range $i, $e := .SomeField}} {{if $i}}, {{end}} $e.TheString {{end}}
デフォルトでは、このテンプレートは要素のカンマ区切りリストを出力します。
one, two, three
ただし、最後の要素の前に「and」を付けて人間が判読できる出力を生成するには、範囲の最後のインデックス。
解決策:
算術演算はテンプレートでは直接サポートされていませんが、回避策として 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) }
このソリューションでは、テンプレートの関数マップの最後に Go 関数が導入されています。この関数は現在のインデックスとコレクションを引数として受け取り、インデックスがコレクションの長さから 1 を引いた値に等しい場合に true を返します。
この関数をテンプレートに組み込むことで、最後の要素を区別して目的の要素を出力できます。 result:
one, two, and three
補足:
別のアプローチでは、len 関数を利用して、リフレクションを必要とせずにテンプレート内のコレクションの長さを計算します。
{{range $i, $e := .}}{{if $i}}, {{end}}{{if eq $i (len $)}}and {{end}}{{$e}}{{end}}.`
以上がGolang テンプレート範囲の最後の要素を検出するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。