Golang のテンプレートで、スライスのインデックスにアクセスし、さらにそのプロパティにアクセスする
2013/02/17
Golangのテンプレートはいろいろとクセがある。
普通に考えて、Elementsのインデックス 3 のオブジェクトのStrValプロパティを表示したかったら、以下のように書けそうな気がする。
{{.Elements.3.StrVal}} |
しかし、Golang text.templateは、スライス(配列)の要素にアクセスするには、indexという関数を使う必要がある。
index Returns the result of indexing its first argument by the following arguments. Thus “index x 1 2 3” is, in Go syntax, x[1][2][3]. Each indexed item must be a map, slice, or array.
文字列のスライスの要素にアクセスするならこれでいいんだけど、スライスの要素がオブジェクトの場合は、これだけでは都合がわるい。
{{index .Elements 3 | .StrVal}} |
これはだめ
{{index .Elements 3 | printf "%s" .StrVal}} |
これもだめ
いろいろ試行錯誤した結果こうなった。
{{with index .Elements 3}}{{.StrVal}}{{end}} |
結局xss対策のために、htmlフィルタを追加して最終形は下のようになった。
{{with index .Elements 3}}{{.StrVal|html}}{{end}} |
なんでこんなに冗長なんだろう