template: treat map keys as zero, not non-existent.

R=adg, r, hoka, rsc
CC=golang-dev
https://golang.org/cl/4036045
This commit is contained in:
Roger Peppe 2011-01-24 14:12:54 -05:00 committed by Russ Cox
parent e7183e7518
commit 72084068a4
2 changed files with 34 additions and 12 deletions

View file

@ -622,7 +622,10 @@ func (t *Template) lookup(st *state, v reflect.Value, name string) reflect.Value
} }
return av.FieldByName(name) return av.FieldByName(name)
case *reflect.MapValue: 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: default:
return nil return nil
} }

View file

@ -522,9 +522,27 @@ func TestMapDriverType(t *testing.T) {
t.Error("unexpected execute error:", err) t.Error("unexpected execute error:", err)
} }
s := b.String() s := b.String()
expected := "template: Ahoy!" expect := "template: Ahoy!"
if s != expected { if s != expect {
t.Errorf("failed passing string as data: expected %q got %q", "template: Ahoy!", s) 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) t.Error("unexpected execute error:", err)
} }
s := b.String() s := b.String()
if s != "template: hello" { expect := "template: hello"
t.Errorf("failed passing string as data: expected %q got %q", "template: hello", s) 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) t.Error("unexpected parse error:", err)
} }
s := b.String() s := b.String()
text := "template: hello" expect := "template: hello"
if s != text { if s != expect {
t.Errorf("failed passing string as data: expected %q got %q", text, s) t.Errorf("failed passing string as data: expected %q got %q", expect, s)
} }
err = tmpl.Execute("hello", &b) err = tmpl.Execute("hello", &b)
if err != nil { if err != nil {
t.Error("unexpected parse error:", err) t.Error("unexpected parse error:", err)
} }
s = b.String() s = b.String()
text += text expect += expect
if s != text { if s != expect {
t.Errorf("failed passing string as data: expected %q got %q", text, s) t.Errorf("failed passing string as data: expected %q got %q", expect, s)
} }
} }