Go Templates: Are Nested Ranges Possible?

This one is seemingly simple but it’s driving me insane.

How does one go about referencing a struct element higher in the scope within a nested range in golang templates?


type Foo struct {
  Id string
  Name string

type Bar struct {
  Id string
  Name string

var foos []Foo
var bars []Bar

// logic to populate both foos and bars

In the template:

{{range .foos}}
  <div>Foo {{.Name}}</div>
    {{range ..bars}}
      <div>Bar {{.Name}} <input type="text" name="ids_{{..Id}}_{{.Id}}" /></div>

Obviously …bars and …Id don’t work, but hopefully my intent is clear. I’d like to iterate through all combinations of Foo and Bar and generate a form element with a name build by both the Foo’s Id and the Bar’s Id.

The problem is that it seems it is impossible to:

  1. Access bars from inside the scope of the foos range scope
  2. Access Foo’s Id from inside the bar’s range scope

I have a temporary workaround to this by putting a bunch of redundant fields in both structs, but this seems very ugly to me, violates DRY, and in general feels very wrong.

Is there any way with golang templates to do what I’d like to do?