Serving Static Website With Go

Serving static website in Go

I would like to describe here how to serve static content with Go. Go http package provides handy function http.FileServer to serve such content. FileServer also allows to browse files when index.html is missing in a catalog.

Preparing files

Let’s create such structure.

$ tree
.
├── assets
│   ├── page.html
│   └── styles
│       └── main.css
└── main.go
File: assets/page.html

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>Document</title>
    <link rel="stylesheet" href="/styles/main.css">
</head>
<body>
    <h1>Hello world!</h1>
</body>
</html>
File: assets/styles/main.css

body {
    background-color: #114FFF;
    color: #FFC14B;
}

Serving only static content

If you would like to serve only static content, you can pass FileServer handler to root path.

package main

import (
	"log"
	"net/http"
)

func main() {
	fs := http.FileServer(http.Dir("./assets"))
	http.Handle("/", fs)

	addr := ":8000"
	log.Printf("Listening on %s", addr)
	log.Fatal(http.ListenAndServe(addr, nil))
}

You can run it with

$ go run main.go
2023/10/25 17:16:13 Listening on :8000

Then you can check your browser with at http://127.0.0.1:8000/page.html.html and you should see Hello world!. When you go to http://127.0.0.1:8000/ you can see the file listing.

Serving static assets for specific path

If you would like to serve only some portion of the routes with FileServer use http.StripPrefix . In this exampleStripPrefix will remove /assets/ part from /assets/styles/main.css request. It is necessary because FileServer does not know about assets part. It only see styles/main.css

package main

import (
	"fmt"
	"log"
	"net/http"
)


func indexHandler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, `<html><head><link rel="stylesheet"" href="/assets/styles/main.css"></head><body>Hello %s</body></html>`, r.URL.Path[1:])
}

func main() {
	fs := http.FileServer(http.Dir("./assets"))
	http.Handle("/assets/", http.StripPrefix("/assets/", fs))
	http.HandleFunc("/", indexHandler)

	addr := ":8000"
	log.Printf("Listening on %s", addr)
	log.Fatal(http.ListenAndServe(addr, nil))
}

Now running this

$ go run main.go
2023/10/25 17:16:13 Listening on :8000

and going to http://127.0.0.1:8000/World should show Hello World with styles.

Join the Newsletter

Subscribe to get my latest content by email.

    I won't send you spam. Unsubscribe at any time.

    For comments, please send me 📧 an email