在HTML模板中访问包含多个结构体的切片中的结构体变量,使用Go语言。

huangapple go评论131阅读模式
英文:

Accessing struct variable in slice of many structs in html template golang

问题

我正在尝试将包含多个结构体的切片发送到一个HTML模板。

我有一个名为'post'的结构体:

  1. type Post struct {
  2. threadID int
  3. subject string
  4. name string
  5. text string
  6. date_posted string
  7. }

我创建了一个Post类型的切片(posts := []Post{}),然后使用来自数据库的行填充该切片,并在模板上执行。

  1. defer latest_threads.Close()
  2. for latest_threads.Next(){
  3. var threadID int
  4. var subject string
  5. var name string
  6. var text string
  7. var date_posted string
  8. latest_threads.Scan(&threadID, &subject, &name, &text, &date_posted)
  9. post := Post{
  10. threadID,
  11. subject,
  12. name,
  13. text,
  14. date_posted,
  15. }
  16. posts = append(posts, post)
  17. }
  18. t, error := template.ParseFiles("thread.html")
  19. if error != nil{
  20. log.Fatal(error)
  21. }
  22. t.Execute(w, posts)

程序编译/运行正常,但在查看模板输出的HTML时,{{.}}可以正常输出,但是在{{range .}}中的第一个{{.threadID}}之后,HTML就停止了。

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>Test</title>
  5. </head>
  6. <body>
  7. <!-- 这里是{{.}},可以正常显示,为了格式化/节省空间已删除 -->
  8. <div>

请注意,我只翻译了代码和HTML部分,其他内容不做翻译。

英文:

I'm attempting to send a slice containing many structs to an html template.

I have a 'post' struct

  1. type Post struct {
  2. threadID int
  3. subject string
  4. name string
  5. text string
  6. date_posted string
  7. }

I create a slice of type Post ( posts := []Post{} )

this slice is then populated using rows from my database and then executed on my template.

  1. defer latest_threads.Close()
  2. for latest_threads.Next(){
  3. var threadID int
  4. var subject string
  5. var name string
  6. var text string
  7. var date_posted string
  8. latest_threads.Scan(&amp;threadID, &amp;subject, &amp;name, &amp;text, &amp;date_posted)
  9. post := Post{
  10. threadID,
  11. subject,
  12. name,
  13. text,
  14. date_posted,
  15. }
  16. posts = append(posts, post)
  17. }
  18. t, error := template.ParseFiles(&quot;thread.html&quot;)
  19. if error != nil{
  20. log.Fatal(error)
  21. }
  22. t.Execute(w, posts)
  23. }

The program compiles / runs okay but when viewing the html output from the template

  1. {{.}}
  2. {{range .}}
  3. &lt;div&gt;{{.threadID}}&lt;/div&gt;
  4. &lt;h3&gt;{{.subject}}&lt;/h3&gt;
  5. &lt;h3&gt;{{.name}}&lt;/h3&gt;
  6. &lt;div&gt;{{.date_posted}}&lt;/div&gt;
  7. &lt;div&gt;&lt;p&gt;{{.text}}&lt;/p&gt;&lt;/div&gt;
  8. &lt;br /&gt;&lt;br /&gt;
  9. {{end}}

{{.}} outputs just fine however upon reaching the first {{.threadID}} in {{range .}} the html stops.

  1. &lt;!DOCTYPE html&gt;
  2. &lt;html&gt;
  3. &lt;head&gt;
  4. &lt;title&gt; Test &lt;/title&gt;
  5. &lt;/head&gt;
  6. &lt;body&gt;
  7. //here is where {{.}} appears just fine, removed for formatting/space saving
  8. &lt;div&gt;

答案1

得分: 15

这是要翻译的内容:

这并不是很直观,但是模板(以及像 JSON 这样的编码包)无法访问未导出的数据成员,所以你必须以某种方式将它们导出:

选项 1

  1. // 直接导出字段
  2. type Post struct {
  3. ThreadID int
  4. Subject, Name, Text, DatePosted string
  5. }

选项 2

  1. // 通过访问器公开字段:
  2. type Post struct {
  3. threadID int
  4. subject, name, text, date_posted string
  5. }
  6. func (p *Post) ThreadID() int { return p.threadID }
  7. func (p *Post) Subject() string { return p.subject }
  8. func (p *Post) Name() string { return p.name }
  9. func (p *Post) Text() string { return p.text }
  10. func (p *Post) DatePosted() string { return p.date_posted }

更新模板

(无论你从上面的哪个选项中选择了哪一个,这部分都是必需的)

  1. {{.}}
  2. {{range .}}
  3. &lt;div&gt;{{.ThreadID}}&lt;/div&gt;
  4. &lt;h3&gt;{{.Subject}}&lt;/h3&gt;
  5. &lt;h3&gt;{{.Name}}&lt;/h3&gt;
  6. &lt;div&gt;{{.DatePosted}}&lt;/div&gt;
  7. &lt;div&gt;&lt;p&gt;{{.Text}}&lt;/p&gt;&lt;/div&gt;
  8. &lt;br /&gt;&lt;br /&gt;
  9. {{end}}

这样应该可以工作。

英文:

It's not really intuitive, but templates (and encoding packages like JSON, for that matter) can't access unexported data members, so you have to export them somehow:

Option 1

  1. // directly export fields
  2. type Post struct {
  3. ThreadID int
  4. Subject, Name, Text, DatePosted string
  5. }

Option 2

  1. // expose fields via accessors:
  2. type Post struct {
  3. threadID int
  4. subject, name, text, date_posted string
  5. }
  6. func (p *Post) ThreadID() int { return p.threadID }
  7. func (p *Post) Subject() string { return p.subject }
  8. func (p *Post) Name() string { return p.name }
  9. func (p *Post) Text() string { return p.text }
  10. func (p *Post) DatePosted() string { return p.date_posted }

Update template

(this part is mandatory regardless of which option you chose from above)

  1. {{.}}
  2. {{range .}}
  3. &lt;div&gt;{{.ThreadID}}&lt;/div&gt;
  4. &lt;h3&gt;{{.Subject}}&lt;/h3&gt;
  5. &lt;h3&gt;{{.Name}}&lt;/h3&gt;
  6. &lt;div&gt;{{.DatePosted}}&lt;/div&gt;
  7. &lt;div&gt;&lt;p&gt;{{.Text}}&lt;/p&gt;&lt;/div&gt;
  8. &lt;br /&gt;&lt;br /&gt;
  9. {{end}}

And this should work.

huangapple
  • 本文由 发表于 2014年2月19日 03:42:12
  • 转载请务必保留本文链接:https://go.coder-hub.com/21863760.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定