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

go, templates

Solution

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

// directly export fields
type Post struct {
    ThreadID int
    Subject, Name, Text, DatePosted string
}

Option 2

// expose fields via accessors:
type Post struct {
    threadID int
    subject, name, text, 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 }

Update template

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

{{.}}
{{range .}}
    <div>{{.ThreadID}}</div>
    <h3>{{.Subject}}</h3>
    <h3>{{.Name}}</h3>
    <div>{{.DatePosted}}</div>
    <div><p>{{.Text}}</p></div>
    <br /><br />
{{end}}

And this should work.

Problem

I'm attempting to send a slice containing many structs to an html template. I have a 'post' struct ``` type Post struct { threadID int subject string name string text string date_posted string } ``` 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. ``` 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) } ``` The program compiles / runs okay but when viewing the html output from the template ``` {{.}} {{range .}} <div>{{.threadID}}</div> <h3>{{.subject}}</h3> <h3>{{.name}}</h3> <div>{{.date_posted}}</div> <div><p>{{.text}}</p></div> <br /><br /> {{end}} ``` `{{.}}` outputs just fine however upon reaching the first `{{.threadID}}` in `{{range .}}` the html stops. ``` <!DOCTYPE html> <html> <head> <title> Test </title> </head> <body> //here is where {{.}} appears just fine, removed for formatting/space saving <div> ```

Original source