package main import ( "log" "net/http" "time" ) type SessionProvider interface { Create(user User, expr time.Duration) (string, error) Get(key string) (User, error) Refresh(key string, user User, expr time.Duration) error } type PageProvider interface { Page(key string) (*Page, error) Save(key string, page *Page) error } type RootHandler struct { Sessions SessionProvider Pages PageProvider } func (h *RootHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { if r.URL.Path == "/admin" { w.Write([]byte("admin route")) return } page, err := h.Pages.Page(r.URL.Path) if err == ErrPageNotFound { w.WriteHeader(http.StatusNotFound) w.Write([]byte("not found")) return } w.Write(page.Contents) } func main() { handler := &RootHandler{ Sessions: &Sessions{}, Pages: &Index{}, } handler.Pages.Save("foo", &Page{ Contents: []byte("foobar"), }) err := http.ListenAndServe(":8080", handler) log.Fatalf("server error: %v", err) }