Golang のテンプレートで、スライスのインデックスにアクセスし、さらにそのプロパティにアクセスする

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

なんでこんなに冗長なんだろう

Leave a Comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.