GoHT Tutorial

1. Create a directory

Create a new directory for the tutorial and navigate to it.

$ mkdir goht-tutorial
$ cd goht-tutorial

2. Initialize

Initialize a new Go module in the directory.

$ go mod init goht-tutorial

And add the GoHT package to the module.

$ go get github.com/stackus/goht

3. Create a GoHT template

Create a new file named hello.goht with the following content.

@goht Hello(name string) {
	%p Hello, #{name}!
}

We can’t use this template yet because we haven’t generated the Go code from it. Let’s do that now.

4. Generate the Go code

Run the goht generate command to generate the Go code from the hello.goht file.

$ goht generate

This will generate a new file named hello.goht.go with the following content.

// Code generated by GoHT - DO NOT EDIT.

package main

import "bytes"
import "context"
import "io"
import "github.com/stackus/goht"

func Hello(name string) goht.Template {
	return goht.TemplateFunc(func(ctx context.Context, __w io.Writer) (__err error) {
		// ...
	})
}

If you need to make changes, you will edit the hello.goht file and run goht generate again. The hello.goht.go file will be overwritten with the new Go code. So don’t worry about editing the generated file. In fact, most IDEs will warn you if you try to edit a generated file.

We didn’t even declare a package, but GoHT went ahead and did that for us. GoHT will output valid Go code that can be used in any Go project.

5. Use the GoHT template

Create a new file named main.go with the following content.

package main

import (
	"context"
	"os"
)

func main() {
    Hello("World").Render(context.Background(), os.Stdout)
}

This is a very basic Go program that uses the Hello template to render the HTML.

This line:

Hello("World").Render(context.Background(), os.Stdout)

Is where we are calling the generated Hello template function. It is called with a string, just like we declared it in the hello.goht file.

Every generated template function will return a goht.Template value which is where the Render method comes from.

The Render method will write the output of the template to the io.Writer that we pass to it. In this case, we are using os.Stdout to write the output to the terminal.

Now run the main.go file.

$ go run main.go

You should see the following output.

<p>Hello, World!</p>

You can edit main.go to change the name that is passed to the Hello function. For example, change Hello("World") to Hello("GoHT") and run the main.go file again.

$ go run main.go

You should see the following output.

<p>Hello, GoHT!</p>

Thanks to GoHT we now have blazingly fast HTML templates that are type-safe and easy to use.