Directory structure for Go web app

Update 2021, with Go 1.16, you would use:

The new embed package provides access to files embedded in the program during compilation using the new //go:embed directive.

See "Embedding files in Go using the "embed" package", from Amit Saha (SRE at @Atlassian) who does embed a template in his project.

//go:embed templates/main.go.tmpl
var tmplMainGo []byte

This makes the contents of the above template available as a slice of bytes in the tmplMainGo variable.

We can then access the template as follows:

tmpl, err := tmpl.Parse(string(tmplMainGo))

See a demo at amitsaha/go-embed.

See also "Working with Embed in Go 1.16 Version" from Barak Amar and his own demo project.


Original answer2014: You could consider using the project jteeuwen/go-bindata (archived in 2018)

This package converts any file into managable Go source code. Useful for embedding binary data into a go program. The file data is optionally gzip compressed before being converted to a raw byte slice.

You can see it used in "golang embed file for later parsing execution use"

That same page also mention GeertJohan/go.rice as an alternative

Another recent good tool comes from esc: Embedding Static Assets in Go

a program that:

  • can take some directories and recursively embed all files in them in a way that was compatible with http.FileSystem
  • can optionally be disabled for use with the local file system for local development
  • will not change the output file on subsequent runs
  • has reasonable-sized diffs when files changed
  • is vendoring-friendly

Where do I put templates and static files in a Go web application project?

is the "wrong" question. If you ask "How will my executable find its resources?" you are almost at the solution: Your executable should read its resources from a (or several) locations which are configurable (and it is always nice to provide sensible defaults). Command line flags, environment variables and config files in the current working directory are common for such tasks. (Of course, if you just have a handful of small resources: Pack them into your executable as VonC recommended; this scheme just breaks down once you start including large assets like images or video.)