html/templateでrangeでindexを使い別のスライスを参照する方法

Go言語のhtml/templateは、スライスやMapオブジェクトに対して{{range $index, $element := xxxxx}}のような記法でインデックスが使えます。

例えば、[]Userと[]Keyという対になったスライスが2つある場合、UserをRangeアクションでループ処理している間に、Key[i]のようにして別のスライスにアクセスしたい場合があります。(本当に汎用的な解決策はおそらくzip関数。)

このような場合は、以下の記述で[]Userと[]Keyのそれぞれの要素にアクセスできます。html/templateでは、{{range $i, $user := users}}でインデックスと要素にアクセスできるため{{$i}} {{$user}}で表示しています。またrangeスコープないなので、ドット{{.}}は、現在のuser要素を表示します。最後に、通常のプログラミング言語でKeys[i]やUser[i]のように要素取得するのを、{{index $.Keys $i}}で行っています。index関数の第一引数が、Keysスライス、第二引数がインデックスという意味です。

また、$.Keysがポイントで、rangeスコープ内で、ドットを指定するとuser要素になりますが、$.とすることでグローバルを参照します。

 

 

結果

 

 

コメントを残す

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

CAPTCHA