package main import ( "html/template" "log" "net/http" "strings" "path/filepath" "os" ) func getTemplateDir() string { exePath, err := os.Executable() if err != nil { log.Fatal(err) } exeDir := filepath.Dir(exePath) testPath := filepath.Join(exeDir, "templates") if _, err := os.Stat(testPath); err == nil { return testPath } // if running using: go run use wd wd, err := os.Getwd() if err != nil { log.Fatal(err) } return filepath.Join(wd, "templates") } func pageHandler(w http.ResponseWriter, r *http.Request) { path := strings.Trim(r.URL.Path, "/") if path == "" { path = "home" } templateDir := getTemplateDir() tmpl, err := template.ParseFiles( filepath.Join(templateDir, "layout.html"), filepath.Join(templateDir, "header.html"), filepath.Join(templateDir, "footer.html"), filepath.Join(templateDir, path+".html"), ) if err != nil { http.NotFound(w, r) return } err = tmpl.ExecuteTemplate(w, "layout", nil) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) } } func main() { http.HandleFunc("/", pageHandler) log.Println("Server running at http://localhost:14888") log.Fatal(http.ListenAndServe(":14888", nil)) }