if err != nil {
t.Fatal(err)
}
+ // Verify that the clone is self-consistent.
+ for k, v := range clone.tmpl {
+ if k == clone.name && v.tmpl[k] != clone {
+ t.Error("clone does not contain root")
+ }
+ if v != v.tmpl[v.name] {
+ t.Errorf("clone does not contain self for %q", k)
+ }
+ }
// Execute root.
var b bytes.Buffer
err = root.ExecuteTemplate(&b, "a", 0)
// common templates and use them with variant definitions for other templates by
// adding the variants after the clone is made.
func (t *Template) Clone() *Template {
- nt := t.copy()
+ nt := t.copy(nil)
nt.init()
+ nt.tmpl[t.name] = nt
for k, v := range t.tmpl {
+ if k == t.name { // Already installed.
+ continue
+ }
// The associated templates share nt's common structure.
- tmpl := v.copy()
- tmpl.common = nt.common
+ tmpl := v.copy(nt.common)
nt.tmpl[k] = tmpl
}
for k, v := range t.parseFuncs {
return nt
}
-// copy returns a shallow copy of t, with common set to nil.
-func (t *Template) copy() *Template {
+// copy returns a shallow copy of t, with common set to the argument.
+func (t *Template) copy(c *common) *Template {
nt := New(t.name)
nt.Tree = t.Tree
+ nt.common = c
nt.leftDelim = t.leftDelim
nt.rightDelim = t.rightDelim
return nt