Рубрика: Golang
gzip golang
package main
import (
"compress/gzip"
"io"
"log"
"net/http"
"strings"
)
type gzipWriter struct {
http.ResponseWriter
Writer io.Writer
}
func (w gzipWriter) Write(b []byte) (int, error) {
// w.Writer будет отвечать за gzip-сжатие, поэтому пишем в него
return w.Writer.Write(b)
}
func gzipHandle(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// проверяем, что клиент поддерживает gzip-сжатие
if !strings.Contains(r.Header.Get("Accept-Encoding"), "gzip") {
// если gzip не поддерживается, передаём управление
// дальше без изменений
log.Println("no support")
next.ServeHTTP(w, r)
return
}
// создаём gzip.Writer поверх текущего w
gz, err := gzip.NewWriterLevel(w, gzip.BestSpeed)
if err != nil {
log.Println("erroe")
io.WriteString(w, err.Error())
return
}
defer gz.Close()
w.Header().Set("Content-Encoding", "gzip")
// передаём обработчику страницы переменную типа gzipWriter для вывода данных
next.ServeHTTP(gzipWriter{ResponseWriter: w, Writer: gz}, r)
})
}
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/", defaultHandle())
http.ListenAndServe(":3000", gzipHandle(mux))
}
// HandlerSetURL - создаем запись для url
func defaultHandle() http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
// заголов ответа json
w.Header().Set("Content-Type", "application/json")
// заголов ответа 201
w.WriteHeader(http.StatusCreated)
w.Write([]byte("привет"))
}
}
https://gist.github.com/evgensr/e048f2a85ec77c2effc4d5a3d84be3f4
HTTP-REST-API
Написал http-rest-api на go
https://github.com/evgensr/http-rest-api
Отработка
- работа с флагами
- работа с конфигом toml
- работа с базой данных postgres
- тестирование
- логирование с разными уровнями
- миграция
- реализация store в памяти
- сессии через cookie
- middleware которы добавляет к каждому запросу uuid и логирует его с выводом времени исполнения
- middleware которы реализует приватные методы api
- CORS
- реализация собственных ошибок
Golang middleware
https://disk.yandex.ru/i/7C8lTVf1FITmyA
Golang interface segregation
Интерфейсы в Golang
Пустой интерфейс
m := map[string]inrerface{}{}
Пустой интерфейс используется например в Println
https://disk.yandex.ru/i/ixlbxFwRpTUh3g