code: func parseFiles(fs http.FileSystem, t *template.Template, filenames ...string) (*template.Template, error) {
  	if len(filenames) == 0 {
  		// Not really a problem, but be consistent.
  		return nil, fmt.Errorf("vfs/html/vfstemplate: no files named in call to ParseFiles")
  	}
  	for _, filename := range filenames {
  		b, err := vfsutil.ReadFile(fs, filename)
  		if err != nil {
  			return nil, err
  		}
  		s := string(b)
  		name := path.Base(filename)
  		// First template becomes return value if not already defined,
  		// and we use that one for subsequent New calls to associate
  		// all the templates together. Also, if this file has the same name
  		// as t, this file becomes the contents of t, so
  		//  t, err := New(name).Funcs(xxx).ParseFiles(name)
  		// works. Otherwise we create a new template associated with t.
  		var tmpl *template.Template
  		if t == nil {
  			t = template.New(name)
  		}
  		if name == t.Name() {
  			tmpl = t
  		} else {
  			tmpl = t.New(name)
  		}
  		_, err = tmpl.Parse(s)
  		if err != nil {
  			return nil, err
  		}
  	}
  	return t, nil
  }
docs: // parseFiles is the helper for the method and function. If the argument
  // template is nil, it is created from the first file.