// Copyright 2023 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Template is a trivial web server that uses the text/template (and // html/template) package's "block" feature to implement a kind of template // inheritance. // // It should be executed from the directory in which the source resides, // as it will look for its template files in the current directory. package main import ( "html/template" "log" "net/http" "strings" ) func main() { http.HandleFunc("/", indexHandler) http.HandleFunc("/image/", imageHandler) log.Fatal(http.ListenAndServe("localhost:8080", nil)) } // indexTemplate is the main site template. // The default template includes two template blocks ("sidebar" and "content") // that may be replaced in templates derived from this one. var indexTemplate = template.Must(template.ParseFiles("index.tmpl")) // Index is a data structure used to populate an indexTemplate. type Index struct { Title string Body string Links []Link } type Link struct { URL, Title string } // indexHandler is an HTTP handler that serves the index page. func indexHandler(w http.ResponseWriter, r *http.Request) { data := &Index{ Title: "Image gallery", Body: "Welcome to the image gallery.", } for name, img := range images { data.Links = append(data.Links, Link{ URL: "/image/" + name, Title: img.Title, }) } if err := indexTemplate.Execute(w, data); err != nil { log.Println(err) } } // imageTemplate is a clone of indexTemplate that provides // alternate "sidebar" and "content" templates. var imageTemplate = template.Must(template.Must(indexTemplate.Clone()).ParseFiles("image.tmpl")) // Image is a data structure used to populate an imageTemplate. type Image struct { Title string URL string } // imageHandler is an HTTP handler that serves the image pages. func imageHandler(w http.ResponseWriter, r *http.Request) { data, ok := images[strings.TrimPrefix(r.URL.Path, "/image/")] if !ok { http.NotFound(w, r) return } if err := imageTemplate.Execute(w, data); err != nil { log.Println(err) } } // images specifies the site content: a collection of images. var images = map[string]*Image{ "go": {"The Go Gopher", "https://golang.org/doc/gopher/frontpage.png"}, "google": {"The Google Logo", "https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png"}, }