我试图将一个包含很多结构的切片发送到html模板.
我有一个’post’结构
type Post struct { threadID int subject string name string text string date_posted string }
我创建一个类型Post(posts:= [] Post {})
然后使用我的数据库中的行填充此切片,然后在我的模板上执行.
defer latest_threads.Close() for latest_threads.Next(){ var threadID int var subject string var name string var text string var date_posted string latest_threads.Scan(&threadID,&subject,&name,&text,&date_posted) post := Post{ threadID,subject,name,text,date_posted,} posts = append(posts,post) } t,error := template.ParseFiles("thread.html") if error != nil{ log.Fatal(error) } t.Execute(w,posts) }
程序编译/运行不错,但从模板查看html输出时
{{.}} {{range .}} <div>{{.threadID}}</div> <h3>{{.subject}}</h3> <h3>{{.name}}</h3> <div>{{.date_posted}}</div> <div><p>{{.text}}</p></div> <br /><br /> {{end}}
{{.}}输出只要达到第{{.threadID}}在{{range}}}的html停止.
<!DOCTYPE html> <html> <head> <title> Test </title> </head> <body> //here is where {{.}} appears just fine,removed for formatting/space saving <div>
解决方法
这不是真的直观,但是模板(和JSON等编码包)无法访问未声明的数据成员,因此您必须以某种方式导出它们:
选项1
// directly export fields type Post struct { ThreadID int Subject,Name,Text,DatePosted string }
选项2
// expose fields via accessors: type Post struct { threadID int subject,date_posted string } func (p *Post) ThreadID() int { return p.threadID } func (p *Post) Subject() string { return p.subject } func (p *Post) Name() string { return p.name } func (p *Post) Text() string { return p.text } func (p *Post) DatePosted() string { return p.date_posted }
更新模板
(此部分是强制性的,无论您从上方选择了哪个选项)
{{.}} {{range .}} <div>{{.ThreadID}}</div> <h3>{{.Subject}}</h3> <h3>{{.Name}}</h3> <div>{{.DatePosted}}</div> <div><p>{{.Text}}</p></div> <br /><br /> {{end}}
这应该工作.