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