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)
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).
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.
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.
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>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With