diff --git a/src/pkg/template/template.go b/src/pkg/template/template.go index a67dbf8ad2..078463aafd 100644 --- a/src/pkg/template/template.go +++ b/src/pkg/template/template.go @@ -622,7 +622,10 @@ func (t *Template) lookup(st *state, v reflect.Value, name string) reflect.Value } return av.FieldByName(name) case *reflect.MapValue: - return av.Elem(reflect.NewValue(name)) + if v := av.Elem(reflect.NewValue(name)); v != nil { + return v + } + return reflect.MakeZero(typ.(*reflect.MapType).Elem()) default: return nil } diff --git a/src/pkg/template/template_test.go b/src/pkg/template/template_test.go index 57f297e8f0..3842b6d6b5 100644 --- a/src/pkg/template/template_test.go +++ b/src/pkg/template/template_test.go @@ -522,9 +522,27 @@ func TestMapDriverType(t *testing.T) { t.Error("unexpected execute error:", err) } s := b.String() - expected := "template: Ahoy!" - if s != expected { - t.Errorf("failed passing string as data: expected %q got %q", "template: Ahoy!", s) + expect := "template: Ahoy!" + if s != expect { + t.Errorf("failed passing string as data: expected %q got %q", expect, s) + } +} + +func TestMapNoEntry(t *testing.T) { + mp := make(map[string]int) + tmpl, err := Parse("template: {notthere}!", nil) + if err != nil { + t.Error("unexpected parse error:", err) + } + var b bytes.Buffer + err = tmpl.Execute(mp, &b) + if err != nil { + t.Error("unexpected execute error:", err) + } + s := b.String() + expect := "template: 0!" + if s != expect { + t.Errorf("failed passing string as data: expected %q got %q", expect, s) } } @@ -539,8 +557,9 @@ func TestStringDriverType(t *testing.T) { t.Error("unexpected execute error:", err) } s := b.String() - if s != "template: hello" { - t.Errorf("failed passing string as data: expected %q got %q", "template: hello", s) + expect := "template: hello" + if s != expect { + t.Errorf("failed passing string as data: expected %q got %q", expect, s) } } @@ -555,18 +574,18 @@ func TestTwice(t *testing.T) { t.Error("unexpected parse error:", err) } s := b.String() - text := "template: hello" - if s != text { - t.Errorf("failed passing string as data: expected %q got %q", text, s) + expect := "template: hello" + if s != expect { + t.Errorf("failed passing string as data: expected %q got %q", expect, s) } err = tmpl.Execute("hello", &b) if err != nil { t.Error("unexpected parse error:", err) } s = b.String() - text += text - if s != text { - t.Errorf("failed passing string as data: expected %q got %q", text, s) + expect += expect + if s != expect { + t.Errorf("failed passing string as data: expected %q got %q", expect, s) } }