tjun月1日記

なんでもいいので毎月書きたい

goのtemplateのrangeで複数の配列を扱う

最初ちょっとやり方が分からなかったのでメモ。

やりたいことは、例えばgoで以下のような配列があったとき

type User struct {
 ID int
 Name string
}

type UserInfo struct {
 ID int
 Age int
}

users := []User{
    User{ID: 1, Name: "taro"},
    User{ID: 2, Name: "jiro"},
    User{ID: 3, Name: "hanako"},
}

infos := []UserInfo{
    UserInfo{ID: 1, Age: 10},
    UserInfo{ID: 2, Age: 20},
    UserInfo{ID: 3, Age: 30},
}

ちょっと例が微妙ですが、usersinfosを同じindexでループを回したいようなことがあるかと思います。

goのtemplateでは、単独のループであれば

{{range $index, $user := Users}}
    {{$user.Name}}
{{end}}

のように書けるのですが、もう一つの配列も同じようにループを回す場合には、以下のように書く必要があります。

{{range $index, $user := Users}}
    {{$user.Name}}
    {{(index $.Infos $index).Age}}
{{end}}

のindexを使って、ループ外部の変数の配列のindexを指定する感じです。