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

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

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください