Golang embed html from file

PumpkinSeed picture PumpkinSeed · Nov 29, 2015 · Viewed 8.5k times · Source

How can I do in Golang if I have an HTML file like this:

<html>
  <head lang="en">

  </head>
  <body>
    <header>{{.Header}}</header>
    <div class="panel panel-default">

    </div>
  </body>
</html>

and I want to embed a part of code into to header tags from an other file like this:

<div id="logo"></div><div id="motto"></div>

My try:

header, _ := template.ParseFiles("header.html")
c := Content{Header: ""}
header.Execute(c.Header, nil)

index := template.Must(template.ParseFiles("index.html"))
index.Execute(w, c)

Answer

icza picture icza · Nov 30, 2015

If you parse all your template files with template.ParseFiles() or with template.ParseGlob(), the templates can refer to each other, they can include each other.

Change your index.html to include the header.html like this:

<html>
  <head lang="en">

  </head>
  <body>
    <header>{{template "header.html"}}</header>
    <div class="panel panel-default">

    </div>
  </body>
</html>

And then the complete program (which parses files from the current directory, executes "index.html" and writes the result to the standard output):

t, err := template.ParseFiles("index.html", "header.html")
if err != nil {
    panic(err)
}

err = t.ExecuteTemplate(os.Stdout, "index.html", nil)
if err != nil {
    panic(err)
}

With template.ParseGlob() it could look like this:

t, err := template.ParseGlob("*.html")
// ...and the rest is the same...

The output (printed on the console):

<html>
  <head lang="en">

  </head>
  <body>
    <header><div id="logo"></div><div id="motto"></div></header>
    <div class="panel panel-default">

    </div>
  </body>
</html>