I got the solution at stackoverflow so sharing it here for the benefit of the community:
You don’t see any errors because you don’t check the error returned by tmpl.Execute(w, nil). When do check it:
… parses the named files and associates the resulting templates with t. If an error occurs, parsing stops and the returned template is nil; otherwise it is t. There must be at least one file. Since the templates created by ParseFiles are named by the base names of the argument files, t should usually have the name of one of the (base) names of the files.
So in your first example t contains a single template, and that single template will be executed by Template.Execute().
In your second example t contains multiple associated templates, t itself being an empty template, and another, associated template named index.html. You may execute that template using Template.ExecuteTemplate():