diff --git a/src/pkg/template/template.go b/src/pkg/template/template.go index 40b9f640b7..1fa55dc8d9 100644 --- a/src/pkg/template/template.go +++ b/src/pkg/template/template.go @@ -623,6 +623,9 @@ func (st *state) findVar(s string) reflect.Value { if data == nil { return nil } + if intf, ok := data.(*reflect.InterfaceValue); ok { + data = intf.Elem() + } switch typ := data.Type().(type) { case *reflect.StructType: @@ -706,6 +709,8 @@ func empty(v reflect.Value) bool { return v.Get() == "" case *reflect.StructValue: return false + case *reflect.MapValue: + return false case *reflect.ArrayValue: return v.Len() == 0 case *reflect.SliceValue: diff --git a/src/pkg/template/template_test.go b/src/pkg/template/template_test.go index a7c34ebeea..31cf318cfc 100644 --- a/src/pkg/template/template_test.go +++ b/src/pkg/template/template_test.go @@ -9,6 +9,7 @@ import ( "container/vector" "fmt" "io" + "json" "testing" ) @@ -40,6 +41,7 @@ type S struct { true bool false bool mp map[string]string + json interface{} innermap U stringmap map[string]string bytes []byte @@ -340,6 +342,16 @@ var tests = []*Test{ out: "55\n", }, + &Test{ + in: "{.section innermap}{.section mp}{innerkey}{.end}{.end}\n", + + out: "55\n", + }, + &Test{ + in: "{.section json}{.repeated section maps}{a}{b}{.end}{.end}\n", + + out: "1234\n", + }, &Test{ in: "{stringmap.stringkey1}\n", @@ -391,6 +403,7 @@ func TestAll(t *testing.T) { s.false = false s.mp = make(map[string]string) s.mp["mapkey"] = "Ahoy!" + s.json, _ = json.Decode("{\"maps\":[{\"a\":1,\"b\":2},{\"a\":3,\"b\":4}]}") s.innermap.mp = make(map[string]int) s.innermap.mp["innerkey"] = 55 s.stringmap = make(map[string]string)