问题
I have Files
slice of File
structure in my Go program to keep name and size of files. I created template, see below:
type File struct {
FileName string
FileSize int64
}
var Files []File
const tmpl = `
{{range .Files}}
file {{.}}
{{end}}
`
t := template.Must(template.New("html").Parse(tmplhtml))
err = t.Execute(os.Stdout, Files)
if err != nil { panic(err) }
Of course I got panic saying:
can't evaluate field Files in type []main.File
Not sure how to correctly display file names and sizes using range
in template.
回答1:
The initial value of your pipeline (the dot) is the value you pass to Template.Execute() which in your case is Files
which is of type []File
.
So during your template execution the dot .
is []File
. This slice has no field or method named Files
which is what .Files
would refer to in your template.
What you should do is simply use .
which refers to your slice:
const tmpl = `
{{range .}}
file {{.}}
{{end}}
`
And that's all. Testing it:
var Files []File = []File{
File{"data.txt", 123},
File{"prog.txt", 5678},
}
t := template.Must(template.New("html").Parse(tmpl))
err := t.Execute(os.Stdout, Files)
Output (try it on the Go Playground):
file {data.txt 123}
file {prog.txt 5678}
来源:https://stackoverflow.com/questions/37124256/go-cant-evaluate-field-when-using-range-to-build-from-template