@tito_walker
В Go существует несколько способов кеширования файлов. Рассмотрим два из них:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
package main import ( "log" "net/http" ) func main() { fs := http.FileServer(http.Dir("static")) http.Handle("/", cacheMiddleware(fs)) log.Fatal(http.ListenAndServe(":8080", nil)) } // функция-посредник для добавления кэширования func cacheMiddleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // устанавливаем заголовки кэширования w.Header().Set("Cache-Control", "max-age=86400") // кешировать на 24 часа w.Header().Set("Expires", time.Now().Add(24*time.Hour).Format(http.TimeFormat)) next.ServeHTTP(w, r) }) } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
package main import ( "log" "net/http" "time" "github.com/patrickmn/go-cache" ) var c = cache.New(24*time.Hour, 10*time.Minute) func main() { http.HandleFunc("/", cacheMiddleware(staticHandler)) log.Fatal(http.ListenAndServe(":8080", nil)) } // функция-посредник для добавления кэширования func cacheMiddleware(next http.Handler) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { // проверяем, есть ли запрашиваемый файл в кэше if x, found := c.Get(r.URL.String()); found { content := x.(string) w.Write([]byte(content)) return } // получаем содержимое файла content, err := getFileContent(r.URL.Path) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } // добавляем содержимое файла в кэш c.Set(r.URL.String(), content, cache.DefaultExpiration) w.Write([]byte(content)) } } // функция для получения содержимого файла func getFileContent(path string) (string, error) { // реализация получения содержимого файла } |
Оба этих метода позволяют добавлять кэширование файлов в вашем веб-приложении на Go.