texte/template question Parse() vs ParseFiles()

Je suis en train de faire un simple travail avec le texte/package de modèle. L'exemple donné dans le haut de modèle est ce que je suis en train de travailler avec.

Comment puis-je écrire le "analysé" fichier donc template.ParseFiles() correctement lit et exécute?

package main

import (
    "text/template"
    "os"
)

type Inventory struct {
    Material string
    Count    uint
}

func main() {
    sweaters := Inventory{"wool", 17}
    tmpl, err := template.New("test").Parse("{{.Count}} items are made of {{.Material}}")
    //tmpl, err := template.New("test").ParseFiles("file.txt")

    if err != nil { panic(err) }
    err = tmpl.Execute(os.Stdout, sweaters)
    if err != nil { panic(err) }
}

/*
Contents of file.txt:
{{.Count}} items are made of {{.Material}}

Error thrown:
panic: template: test:1: "test" is an incomplete or empty template

goroutine 1 [running]:
main.main()
    /tmp/templates/t.go:19 +0x21a

goroutine 2 [syscall]:
created by runtime.main
    /var/tmp/portage/dev-lang/go-1.0.1/work/go/src/pkg/runtime/proc.c:221
*/

J'ai une copie de ce code affiché à l'golang aire de jeux ici

Edit #1:
J'ai fait quelques recherches sur cette question... puisque c'est la Execute() méthode qui lève l'exception, et non la ParseFiles() partie, j'ai vérifié la définition de la méthode:

//Execute applies a parsed template to the specified data object,
//and writes the output to wr.
func (t *Template) Execute(wr io.Writer, data interface{}) (err error) {
    defer errRecover(&err)
    value := reflect.ValueOf(data)
    state := &state{
        tmpl: t,
        wr:   wr,
        line: 1,
        vars: []variable{{"$", value}},
    }
    if t.Tree == nil || t.Root == nil {
        state.errorf("%q is an incomplete or empty template", t.name)
    }
    state.walk(value, t.Root)
    return
}

Donc, sur une intuition, j'ai perdu la valeur de t.Arbre pour le inline 'non-fichier de style, tmpl est: &parse.Tree{Name:"test", Root:(*parse.ListNode)(0xf840030700), funcs:[]map[string]interface {}(nil), lex:(*parse.lexer)(nil), token:[2]parse.item{parse.item{typ:6, val:""}, parse.item{typ:9, val:"{{"}}, peekCount:1, vars:[]string(nil)} et
quand a couru avec ParseFiles(), tmpl est: (*parse.Tree)(nil). Je trouve bizarre que l'on est un déréférencement, et une valeur est un pointeur. Cela peut aider à résoudre l'énigme

Remarque, la chose intéressante à propos de cet exemple, et d'autres ParseFiles() des tests que j'ai fait, ils ne sont pas sur l'analyse, ils ne parviennent pas quand ils arrivent à l'Execute() de phase, toujours avec le incomplètes ou modèle vide message
Votre lié golang aire de jeux exemple fonctionne pour moi. Êtes-vous sûr que c'est en fait cassé?
Oui, il fonctionne très bien, parce que vous n'avez pas accès à un système de fichiers sur l'aire de jeux. Toutefois, si vous supprimez le ParseFiles() ligne, commentez les autres Parse() ligne de l'exécuter localement, vous verrez l'erreur que j'ai dans les commentaires dans le code.

OriginalL'auteur Evan Plumlee | 2012-08-04