Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Golang embed html from file

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)
like image 928
PumpkinSeed Avatar asked Nov 29 '15 14:11

PumpkinSeed


People also ask

How do I embed a file in Golang?

Using the Golang embed directive In the example above, we are using the directive //go:embed from embed package, followed by the filename we want to embed. On the next line, we create a new variable where the content of the file will be placed. This variable can be of type string, []byte, or FS(FileSystem).

Why use Go embed?

Go embed tutorial shows how to access embedded files from within a running Go program. The embed package allows to access static files such as images and HTML files from within a running Go binary. It was introduced in Go 1.16.

How does Golang embed work?

The basic idea of embedding is that by adding a special comment to your code, Go will know to include a file or files. The comment should look like //go:embed FILENAME(S) and be followed by a variable of the type you want to embed: string or []byte for an individual file or embed. FS for a group of files.


1 Answers

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>
like image 101
icza Avatar answered Sep 21 '22 04:09

icza