Pridedame Chi routerΔ―, kuriame pirmuosius handlerius ir marΕ‘rutus.
KairΔje β pamokΕ³ sΔ raΕ‘as ir projekto failai. DeΕ‘inΔje β paaiΕ‘kinimai ir realus kodas. Kiekvienas projektas baigiasi veikianΔia sistema.
Tu kΔ tik perΔjai visΔ pilnΔ projektΔ nuo pirmo commit iki veikianΔios sistemos.
KairΔje β pamokΕ³ sΔ raΕ‘as ir projekto failai. DeΕ‘inΔje β paaiΕ‘kinimai ir realus kodas. Kiekvienas projektas baigiasi veikianΔia sistema.
Pridedame Chi routerΔ―, kuriame pirmuosius handlerius ir marΕ‘rutus.
Ε ios pamokos failai
main.go
Chi yra lengvas HTTP routeris. Pridedame:
go get github.com/go-chi/chi/v5func main() {
r := chi.NewRouter()
r.Use(middleware.Logger)
r.Use(handlers.LanguageMiddleware)
r.Get("/", handlers.HandleHome(queries))
r.Get("/stacks/{slug}", handlers.HandleStack(queries))
r.Get("/lessons/{slug}", handlers.HandleLesson(queries))
http.ListenAndServe(":8090", r)
}{slug} nuskaitomas su chi.URLParam(r, "slug").
handlers/home.go
Kiekvienas handleris naudoja closure pattern.
func HandleHome(queries *internaldb.Queries) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
lang := GetLang(r)
t := i18n.Get(lang)
stacks, err := queries.GetAllStacks(r.Context())
if err != nil {
http.Error(w, "server error", 500)
return
}
templates.HomePage(t, lang, stacks).Render(r.Context(), w)
}
}handlers/middleware.go
Middleware vykdomas prieΕ‘ kiekvienΔ request.
func LanguageMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
lang := "lt"
if cookie, err := r.Cookie("lang"); err == nil {
if cookie.Value == "en" || cookie.Value == "lt" {
lang = cookie.Value
}
}
ctx := context.WithValue(r.Context(), LangKey, lang)
next.ServeHTTP(w, r.WithContext(ctx))
})
}Bet kuriame handleryje:
lang := GetLang(r)Tu kΔ tik perΔjai visΔ pilnΔ projektΔ nuo pirmo commit iki veikianΔios sistemos.