āĻ—ā§‹āĻ˛āĻ‚-āĻ āĻ“āĻ¯āĻŧā§‡āĻŦ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡āĻ° āĻŦāĻŋāĻ•āĻžāĻļ - āĻ¸āĻšāĻœ āĻĨā§‡āĻ•ā§‡ āĻœāĻŸāĻŋāĻ˛ āĻĒāĻ°ā§āĻ¯āĻ¨ā§āĻ¤

āĻ—ā§‹āĻ˛āĻ‚-āĻ āĻ“āĻ¯āĻŧā§‡āĻŦ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡āĻ° āĻŦāĻŋāĻ•āĻžāĻļ - āĻ¸āĻšāĻœ āĻĨā§‡āĻ•ā§‡ āĻœāĻŸāĻŋāĻ˛ āĻĒāĻ°ā§āĻ¯āĻ¨ā§āĻ¤

āĻĒāĻžāĻāĻš āĻŦāĻ›āĻ° āĻ†āĻ—ā§‡ āĻļā§āĻ°ā§ āĻ•āĻ°ā§‡āĻ›āĻŋāĻ˛āĻžāĻŽ Gophish āĻŦāĻŋāĻ•āĻžāĻļ, āĻāĻŸāĻŋ āĻ—ā§‹āĻ˛āĻ‚ āĻļā§‡āĻ–āĻžāĻ° āĻ¸ā§āĻ¯ā§‹āĻ— āĻ•āĻ°ā§‡ āĻĻāĻŋāĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤ āĻ†āĻŽāĻŋ āĻŦā§āĻāĻ¤ā§‡ āĻĒā§‡āĻ°ā§‡āĻ›āĻŋ āĻ¯ā§‡ āĻ—ā§‹ āĻāĻ•āĻŸāĻŋ āĻļāĻ•ā§āĻ¤āĻŋāĻļāĻžāĻ˛ā§€ āĻ­āĻžāĻˇāĻž, āĻ…āĻ¨ā§‡āĻ• āĻ˛āĻžāĻ‡āĻŦā§āĻ°ā§‡āĻ°āĻŋ āĻĻā§āĻŦāĻžāĻ°āĻž āĻĒāĻ°āĻŋāĻĒā§‚āĻ°āĻ•āĨ¤ Go āĻŦāĻšā§āĻŽā§āĻ–ā§€: āĻŦāĻŋāĻļā§‡āĻˇ āĻ•āĻ°ā§‡, āĻāĻŸāĻŋ āĻ•ā§‹āĻ¨ā§‹ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž āĻ›āĻžāĻĄāĻŧāĻžāĻ‡ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°-āĻ¸āĻžāĻ‡āĻĄ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻŦāĻŋāĻ•āĻžāĻļ āĻ•āĻ°āĻ¤ā§‡ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤

āĻāĻ‡ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻŸāĻŋ Go-āĻ¤ā§‡ āĻāĻ•āĻŸāĻŋ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻ˛ā§‡āĻ–āĻžāĻ° āĻŦāĻŋāĻˇāĻ¯āĻŧā§‡āĨ¤ āĻ†āĻ¸ā§āĻ¨ "āĻšā§āĻ¯āĻžāĻ˛ā§‹ āĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ˛ā§āĻĄ!" āĻāĻ° āĻŽāĻ¤ā§‹ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ āĻœāĻŋāĻ¨āĻŋāĻ¸ āĻĻāĻŋāĻ¯āĻŧā§‡ āĻļā§āĻ°ā§ āĻ•āĻ°āĻŋ āĻāĻŦāĻ‚ āĻ¨āĻŋāĻŽā§āĻ¨āĻ˛āĻŋāĻ–āĻŋāĻ¤ āĻ•ā§āĻˇāĻŽāĻ¤āĻž āĻ¸āĻš āĻāĻ•āĻŸāĻŋ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻĻāĻŋāĻ¯āĻŧā§‡ āĻļā§‡āĻˇ āĻ•āĻ°āĻŋ:

- āĻ˛ā§‡āĻŸāĻ¸ āĻāĻ¨āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ HTTPS āĻāĻ° āĻœāĻ¨ā§āĻ¯āĨ¤
— āĻāĻĒāĻŋāĻ†āĻ‡ āĻ°āĻžāĻ‰āĻŸāĻžāĻ° āĻšāĻŋāĻ¸ā§‡āĻŦā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻžāĨ¤
- āĻŽāĻŋāĻĄāĻ˛āĻ“āĻ¯āĻŧā§āĻ¯āĻžāĻ°ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻžāĨ¤
- āĻ¸ā§āĻŸā§āĻ¯āĻžāĻŸāĻŋāĻ• āĻĢāĻžāĻ‡āĻ˛ā§‡āĻ° āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ•āĻ°āĻŖāĨ¤
- āĻ¸āĻ āĻŋāĻ• āĻļāĻžāĻŸāĻĄāĻžāĻ‰āĻ¨āĨ¤

Skillbox āĻ¸ā§āĻĒāĻžāĻ°āĻŋāĻļ āĻ•āĻ°ā§‡: āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻŋāĻ• āĻ•ā§‹āĻ°ā§āĻ¸ "āĻļā§āĻ°ā§ āĻĨā§‡āĻ•ā§‡ āĻĒāĻžāĻ‡āĻĨāĻ¨ āĻŦāĻŋāĻ•āĻžāĻļāĻ•āĻžāĻ°ā§€".

āĻ†āĻŽāĻ°āĻž āĻŽāĻ¨ā§‡ āĻ•āĻ°āĻŋāĻ¯āĻŧā§‡ āĻĻāĻŋāĻšā§āĻ›āĻŋ: "Habr"-āĻāĻ° āĻ¸āĻ•āĻ˛ āĻĒāĻžāĻ āĻ•āĻĻā§‡āĻ° āĻœāĻ¨ā§āĻ¯ - "Habr" āĻĒā§āĻ°āĻšāĻžāĻ°āĻŽā§‚āĻ˛āĻ• āĻ•ā§‹āĻĄ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ¯ā§‡āĻ•ā§‹āĻ¨ā§‹ Skillbox āĻ•ā§‹āĻ°ā§āĻ¸ā§‡ āĻ¨āĻĨāĻŋāĻ­ā§āĻ•ā§āĻ¤ āĻ•āĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ 10 āĻ°ā§āĻŦā§‡āĻ˛ āĻ›āĻžāĻĄāĻŧāĨ¤

āĻšā§āĻ¯āĻžāĻ˛ā§‹, āĻŦāĻŋāĻļā§āĻŦ!

āĻ†āĻĒāĻ¨āĻŋ āĻ–ā§āĻŦ āĻĻā§āĻ°ā§āĻ¤ Go āĻ āĻāĻ•āĻŸāĻŋ āĻ“āĻ¯āĻŧā§‡āĻŦ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨āĨ¤ āĻāĻ–āĻžāĻ¨ā§‡ āĻāĻ•āĻŸāĻŋ āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻ˛āĻžāĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻžāĻ° āĻāĻ•āĻŸāĻŋ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ āĻ¯āĻž āĻ‰āĻĒāĻ°ā§‡ āĻĒā§āĻ°āĻ¤āĻŋāĻļā§āĻ°ā§āĻ¤ "āĻšā§āĻ¯āĻžāĻ˛ā§‹, āĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ˛ā§āĻĄ!" āĻĢā§‡āĻ°āĻ¤ āĻĻā§‡āĻ¯āĻŧāĨ¤

package main
 
import (
"fmt"
"net/http"
)
 
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello World!")
})
http.ListenAndServe(":80", nil)
}

āĻāĻ° āĻĒāĻ°ā§‡, āĻ†āĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨āĻŸāĻŋ āĻšāĻžāĻ˛āĻžāĻ¨ āĻāĻŦāĻ‚ āĻĒā§ƒāĻˇā§āĻ āĻžāĻŸāĻŋ āĻ–ā§āĻ˛ā§āĻ¨ āĻ¸ā§āĻĨāĻžāĻ¨ā§€āĻ¯āĻŧ āĻšā§‹āĻ¸ā§āĻŸ, āĻ¤āĻžāĻ°āĻĒāĻ° āĻ†āĻĒāĻ¨āĻŋ āĻ…āĻŦāĻŋāĻ˛āĻŽā§āĻŦā§‡ āĻĒāĻžāĻ ā§āĻ¯ āĻĻā§‡āĻ–āĻ¤ā§‡ āĻĒāĻžāĻŦā§‡āĻ¨ "āĻšā§āĻ¯āĻžāĻ˛ā§‹, āĻŦāĻŋāĻļā§āĻŦ!" (āĻ¯āĻĻāĻŋ āĻ¸āĻŦāĻ•āĻŋāĻ›ā§ āĻ¸āĻ āĻŋāĻ•āĻ­āĻžāĻŦā§‡ āĻ•āĻžāĻœ āĻ•āĻ°ā§‡, āĻ…āĻŦāĻļā§āĻ¯āĻ‡)āĨ¤

āĻ†āĻŽāĻ°āĻž āĻĒāĻ°ā§‡ āĻāĻ•āĻžāĻ§āĻŋāĻ•āĻŦāĻžāĻ° āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻ˛āĻžāĻ°āĻŸāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŦ, āĻ¤āĻŦā§‡ āĻĒā§āĻ°āĻĨāĻŽā§‡ āĻ¸āĻŦāĻ•āĻŋāĻ›ā§ āĻ•ā§€āĻ­āĻžāĻŦā§‡ āĻ•āĻžāĻœ āĻ•āĻ°ā§‡ āĻ¤āĻž āĻŦā§‹āĻāĻž āĻ¯āĻžāĻ•āĨ¤

āĻ¨ā§‡āĻŸ/http

āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻœ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡ net/http, āĻāĻŸāĻŋ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻāĻŦāĻ‚ HTTP āĻ•ā§āĻ˛āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ āĻ‰āĻ­āĻ¯āĻŧ āĻŦāĻŋāĻ•āĻžāĻļā§‡āĻ° āĻœāĻ¨ā§āĻ¯ Go-āĻ¤ā§‡ āĻĒā§āĻ°āĻžāĻĨāĻŽāĻŋāĻ• āĻ¸āĻ°āĻžā§āĻœāĻžāĻŽāĨ¤ āĻ•ā§‹āĻĄāĻŸāĻŋ āĻŦā§‹āĻāĻžāĻ° āĻœāĻ¨ā§āĻ¯, āĻ†āĻ¸ā§āĻ¨ āĻ¤āĻŋāĻ¨āĻŸāĻŋ āĻ—ā§āĻ°ā§āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ āĻ‰āĻĒāĻžāĻĻāĻžāĻ¨ā§‡āĻ° āĻ…āĻ°ā§āĻĨ āĻŦā§āĻāĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋ: http.Handler, http.ServeMux āĻāĻŦāĻ‚ http.ServerāĨ¤

HTTP āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻ˛āĻžāĻ°

āĻ¯āĻ–āĻ¨ āĻ†āĻŽāĻ°āĻž āĻāĻ•āĻŸāĻŋ āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ āĻĒāĻžāĻ‡, āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻ˛āĻžāĻ° āĻāĻŸāĻŋ āĻŦāĻŋāĻļā§āĻ˛ā§‡āĻˇāĻŖ āĻ•āĻ°ā§‡ āĻāĻŦāĻ‚ āĻāĻ•āĻŸāĻŋ āĻĒā§āĻ°āĻ¤āĻŋāĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§‡āĨ¤ Go-āĻ¤ā§‡ āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻ˛āĻžāĻ°āĻ—ā§āĻ˛āĻŋ āĻ¨āĻŋāĻŽā§āĻ¨āĻ°ā§‚āĻĒ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻ— āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ:

type Handler interface {
        ServeHTTP(ResponseWriter, *Request)
}

āĻĒā§āĻ°āĻĨāĻŽ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻŸāĻŋ http.HandleFunc āĻ¸āĻšāĻžāĻ¯āĻŧāĻ• āĻĢāĻžāĻ‚āĻļāĻ¨ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡āĨ¤ āĻāĻŸāĻŋ āĻ…āĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻĢāĻžāĻ‚āĻļāĻ¨ āĻ°â€ā§āĻ¯āĻžāĻĒ āĻ•āĻ°ā§‡, āĻ¯āĻž āĻĢāĻ˛āĻ¸ā§āĻŦāĻ°ā§‚āĻĒ http.ResponseWriter āĻāĻŦāĻ‚ http.Request āĻ•ā§‡ ServeHTTP-āĻ āĻ¨ā§‡āĻ¯āĻŧāĨ¤

āĻ…āĻ¨ā§āĻ¯ āĻ•āĻĨāĻžāĻ¯āĻŧ, āĻ—ā§‹āĻ˛āĻ‚-āĻāĻ° āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻ˛āĻžāĻ°āĻ—ā§āĻ˛āĻŋ āĻāĻ•āĻŸāĻŋ āĻāĻ•āĻ• āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻĢā§‡āĻ¸ā§‡ āĻ‰āĻĒāĻ¸ā§āĻĨāĻžāĻĒāĻŋāĻ¤ āĻšāĻ¯āĻŧ, āĻ¯āĻž āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽāĻžāĻ°āĻ•ā§‡ āĻ…āĻ¨ā§‡āĻ•āĻ—ā§āĻ˛āĻŋ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ āĻĻā§‡āĻ¯āĻŧāĨ¤ āĻ¸ā§āĻ¤āĻ°āĻžāĻ‚, āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, āĻŽāĻŋāĻĄāĻ˛āĻ“āĻ¯āĻŧā§āĻ¯āĻžāĻ° āĻāĻ•āĻŸāĻŋ āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻ˛āĻžāĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻ— āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ, āĻ¯ā§‡āĻ–āĻžāĻ¨ā§‡ ServeHTTP āĻĒā§āĻ°āĻĨāĻŽā§‡ āĻ•āĻŋāĻ›ā§ āĻ•āĻ°ā§‡ āĻāĻŦāĻ‚ āĻ¤āĻžāĻ°āĻĒāĻ° āĻ…āĻ¨ā§āĻ¯ āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻ˛āĻžāĻ°ā§‡āĻ° ServeHTTP āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻ•ā§‡ āĻ•āĻ˛ āĻ•āĻ°ā§‡āĨ¤

āĻ‰āĻĒāĻ°ā§‡ āĻ‰āĻ˛ā§āĻ˛āĻŋāĻ–āĻŋāĻ¤ āĻšāĻŋāĻ¸āĻžāĻŦā§‡, āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻ˛āĻžāĻ°āĻ°āĻž āĻ•ā§‡āĻŦāĻ˛ āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ā§‡āĻ° āĻĒā§āĻ°āĻ¤āĻŋāĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§‡āĨ¤ āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ¸āĻŽāĻ¯āĻŧā§‡ āĻ•ā§‹āĻ¨ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻ˛āĻžāĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻ‰āĻšāĻŋāĻ¤?

āĻ°āĻžāĻ‰āĻŸāĻŋāĻ‚ āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ āĻ•āĻ°ā§āĻ¨

āĻ¸āĻ āĻŋāĻ• āĻĒāĻ›āĻ¨ā§āĻĻ āĻ•āĻ°āĻ¤ā§‡, āĻāĻ•āĻŸāĻŋ HTTP āĻŽāĻžāĻ˛ā§āĻŸāĻŋāĻĒā§āĻ˛ā§‡āĻ•ā§āĻ¸āĻžāĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§āĻ¨āĨ¤ āĻŦā§‡āĻļ āĻ•āĻ¯āĻŧā§‡āĻ•āĻŸāĻŋ āĻ˛āĻžāĻ‡āĻŦā§āĻ°ā§‡āĻ°āĻŋāĻ¤ā§‡ āĻāĻ•ā§‡ āĻŦāĻ˛āĻž āĻšāĻ¯āĻŧ āĻŽā§āĻ•ā§āĻ¸āĻžāĻ° āĻŦāĻž āĻ°āĻžāĻ‰āĻŸāĻžāĻ°, āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻāĻ—ā§āĻ˛āĻŋ āĻ¸āĻŦ āĻāĻ•āĻ‡ āĻœāĻŋāĻ¨āĻŋāĻ¸āĨ¤ āĻŽāĻžāĻ˛ā§āĻŸāĻŋāĻĒā§āĻ˛ā§‡āĻ•ā§āĻ¸āĻžāĻ°ā§‡āĻ° āĻ•āĻžāĻœ āĻšāĻ˛ āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ā§‡āĻ° āĻĒāĻĨ āĻŦāĻŋāĻļā§āĻ˛ā§‡āĻˇāĻŖ āĻ•āĻ°āĻž āĻāĻŦāĻ‚ āĻ‰āĻĒāĻ¯ā§āĻ•ā§āĻ¤ āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻ˛āĻžāĻ° āĻ¨āĻŋāĻ°ā§āĻŦāĻžāĻšāĻ¨ āĻ•āĻ°āĻžāĨ¤

āĻ†āĻĒāĻ¨āĻžāĻ° āĻ¯āĻĻāĻŋ āĻœāĻŸāĻŋāĻ˛ āĻ°āĻžāĻ‰āĻŸāĻŋāĻ‚āĻ¯āĻŧā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ¸āĻŽāĻ°ā§āĻĨāĻ¨ā§‡āĻ° āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ āĻšāĻ¯āĻŧ āĻ¤āĻŦā§‡ āĻ¤ā§ƒāĻ¤ā§€āĻ¯āĻŧ āĻĒāĻ•ā§āĻˇā§‡āĻ° āĻ˛āĻžāĻ‡āĻŦā§āĻ°ā§‡āĻ°āĻŋāĻ—ā§āĻ˛āĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻ­āĻžāĻ˛āĨ¤ āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻ‰āĻ¨ā§āĻ¨āĻ¤ āĻ•āĻŋāĻ›ā§ - āĻ—āĻ°āĻŋāĻ˛āĻž/āĻŽā§āĻ•ā§āĻ¸ и go-chi/chi, āĻāĻ‡ āĻ˛āĻžāĻ‡āĻŦā§āĻ°ā§‡āĻ°āĻŋ āĻ•ā§‹āĻ¨ā§‹ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž āĻ›āĻžāĻĄāĻŧāĻžāĻ‡ āĻŽāĻ§ā§āĻ¯āĻŦāĻ°ā§āĻ¤ā§€ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ•āĻ°āĻŖ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ āĻ•āĻ°āĻž āĻ¸āĻŽā§āĻ­āĻŦ āĻ•āĻ°ā§‡ āĻ¤ā§‹āĻ˛ā§‡āĨ¤ āĻ¤āĻžāĻĻā§‡āĻ° āĻ¸āĻžāĻšāĻžāĻ¯ā§āĻ¯ā§‡, āĻ†āĻĒāĻ¨āĻŋ āĻ“āĻ¯āĻŧāĻžāĻ‡āĻ˛ā§āĻĄāĻ•āĻžāĻ°ā§āĻĄ āĻ°āĻžāĻ‰āĻŸāĻŋāĻ‚ āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ āĻāĻŦāĻ‚ āĻ…āĻ¨ā§āĻ¯āĻžāĻ¨ā§āĻ¯ āĻ…āĻ¨ā§‡āĻ•āĻ—ā§āĻ˛āĻŋ āĻ•āĻžāĻœ āĻ¸āĻŽā§āĻĒāĻžāĻĻāĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨āĨ¤ āĻ¤āĻžāĻĻā§‡āĻ° āĻ¸ā§āĻŦāĻŋāĻ§āĻž āĻšāĻ˛ āĻ¸ā§āĻŸā§āĻ¯āĻžāĻ¨ā§āĻĄāĻžāĻ°ā§āĻĄ HTTP āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻ˛āĻžāĻ°ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ¸āĻžāĻŽāĻžā§āĻœāĻ¸ā§āĻ¯āĻĒā§‚āĻ°ā§āĻŖāĨ¤ āĻĢāĻ˛āĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, āĻ†āĻĒāĻ¨āĻŋ āĻ¸āĻšāĻœ āĻ•ā§‹āĻĄ āĻ˛āĻŋāĻ–āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ āĻ¯āĻž āĻ­āĻŦāĻŋāĻˇā§āĻ¯āĻ¤ā§‡ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤

āĻāĻ•āĻŸāĻŋ āĻ¸ā§āĻŦāĻžāĻ­āĻžāĻŦāĻŋāĻ• āĻĒāĻ°āĻŋāĻ¸ā§āĻĨāĻŋāĻ¤āĻŋāĻ¤ā§‡ āĻœāĻŸāĻŋāĻ˛ āĻ•āĻžāĻ āĻžāĻŽā§‹āĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ…-āĻŽāĻžāĻ¨āĻ• āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨ā§‡āĻ° āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ āĻšāĻŦā§‡ āĻāĻŦāĻ‚ āĻāĻŸāĻŋ āĻĄāĻŋāĻĢāĻ˛ā§āĻŸ āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻ˛āĻžāĻ°ā§‡āĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•ā§‡ āĻ‰āĻ˛ā§āĻ˛ā§‡āĻ–āĻ¯ā§‹āĻ—ā§āĻ¯āĻ­āĻžāĻŦā§‡ āĻœāĻŸāĻŋāĻ˛ āĻ•āĻ°ā§‡ āĻ¤ā§‹āĻ˛ā§‡āĨ¤ āĻŦā§‡āĻļāĻŋāĻ°āĻ­āĻžāĻ— āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻ¤ā§‡, āĻĄāĻŋāĻĢāĻ˛ā§āĻŸ āĻ˛āĻžāĻ‡āĻŦā§āĻ°ā§‡āĻ°āĻŋ āĻāĻŦāĻ‚ āĻāĻ•āĻŸāĻŋ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ āĻ°āĻžāĻ‰āĻŸāĻžāĻ°ā§‡āĻ° āĻ¸āĻ‚āĻŽāĻŋāĻļā§āĻ°āĻŖ āĻ¯āĻĨā§‡āĻˇā§āĻŸ āĻšāĻŦā§‡āĨ¤

āĻ•ā§āĻ¯ā§‹āĻ¯āĻŧāĻžāĻ°ā§€ āĻĒā§āĻ°āĻ¸ā§‡āĻ¸āĻŋāĻ‚

āĻ‰āĻĒāĻ°āĻ¨ā§āĻ¤ā§, āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻ‰āĻĒāĻžāĻĻāĻžāĻ¨ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ āĻ¯āĻž āĻ‡āĻ¨āĻ•āĻžāĻŽāĻŋāĻ‚ āĻ¸āĻ‚āĻ¯ā§‹āĻ—āĻ—ā§āĻ˛āĻŋāĻ° āĻœāĻ¨ā§āĻ¯ "āĻļā§āĻ¨āĻŦā§‡" āĻāĻŦāĻ‚ āĻ¸āĻ āĻŋāĻ• āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻ˛āĻžāĻ°ā§‡āĻ° āĻ•āĻžāĻ›ā§‡ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ āĻĒā§āĻ¨āĻƒāĻ¨āĻŋāĻ°ā§āĻĻā§‡āĻļ āĻ•āĻ°āĻŦā§‡ā§ˇ http.Server āĻ¸āĻšāĻœā§‡āĻ‡ āĻāĻ‡ āĻ•āĻžāĻœāĻŸāĻŋ āĻĒāĻ°āĻŋāĻšāĻžāĻ˛āĻ¨āĻž āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤

āĻ¨āĻŋāĻŽā§āĻ¨āĻ˛āĻŋāĻ–āĻŋāĻ¤ āĻĻā§‡āĻ–āĻžāĻ¯āĻŧ āĻ¯ā§‡ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ•āĻ°āĻŖā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•āĻŋāĻ¤ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ•āĻžāĻœā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻĻāĻžāĻ¯āĻŧā§€āĨ¤ āĻāĻŸāĻŋ, āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, TLS āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ•āĻžāĻœ āĻ•āĻ°ā§‡āĨ¤ http.ListenAndServer āĻ•āĻ˛āĻŸāĻŋ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ āĻ•āĻ°āĻ¤ā§‡, āĻāĻ•āĻŸāĻŋ āĻ†āĻĻāĻ°ā§āĻļ HTTP āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻšāĻ¯āĻŧāĨ¤

āĻāĻ–āĻ¨ āĻ†āĻ°āĻ“ āĻœāĻŸāĻŋāĻ˛ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ āĻĻā§‡āĻ–āĻž āĻ¯āĻžāĻ•āĨ¤

āĻ¯ā§‹āĻ— āĻ•āĻ°āĻž āĻ¯āĻžāĻ• āĻāĻ¨āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸ āĻ•āĻ°āĻž āĻ¯āĻžāĻ•

āĻĄāĻŋāĻĢāĻ˛ā§āĻŸāĻ°ā§‚āĻĒā§‡, āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨āĻŸāĻŋ HTTP āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ā§‡āĻ° āĻ‰āĻĒāĻ° āĻšāĻ˛ā§‡, āĻ¤āĻŦā§‡ āĻāĻŸāĻŋ HTTPS āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻžāĻ° āĻĒāĻ°āĻžāĻŽāĻ°ā§āĻļ āĻĻā§‡āĻ“āĻ¯āĻŧāĻž āĻšāĻ¯āĻŧāĨ¤ āĻāĻŸāĻŋ Go āĻ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž āĻ›āĻžāĻĄāĻŧāĻžāĻ‡ āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤ āĻ†āĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ āĻāĻ•āĻŸāĻŋ āĻļāĻ‚āĻ¸āĻžāĻĒāĻ¤ā§āĻ° āĻāĻŦāĻ‚ āĻŦā§āĻ¯āĻ•ā§āĻ¤āĻŋāĻ—āĻ¤ āĻ•ā§€ āĻĒā§‡āĻ¯āĻŧā§‡ āĻĨāĻžāĻ•ā§‡āĻ¨ āĻ¤āĻŦā§‡ āĻ¸āĻ āĻŋāĻ• āĻļāĻ‚āĻ¸āĻžāĻĒāĻ¤ā§āĻ° āĻāĻŦāĻ‚ āĻ•ā§€ āĻĢāĻžāĻ‡āĻ˛āĻ—ā§āĻ˛āĻŋāĻ° āĻ¸āĻžāĻĨā§‡ ListenAndServeTLS āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻ¨ āĻ•āĻ°āĻž āĻ¯āĻĨā§‡āĻˇā§āĻŸāĨ¤

http.ListenAndServeTLS(":443", "cert.pem", "key.pem", nil)

āĻ†āĻĒāĻ¨āĻŋ āĻ¸āĻŦāĻ¸āĻŽāĻ¯āĻŧ āĻ­āĻžāĻ˛ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨.

āĻāĻ° āĻāĻ¨āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸ āĻ¯āĻžāĻ• āĻ¸ā§āĻŦāĻ¯āĻŧāĻ‚āĻ•ā§āĻ°āĻŋāĻ¯āĻŧ āĻĒā§āĻ¨āĻ°ā§āĻ¨āĻŦā§€āĻ•āĻ°āĻŖ āĻ¸āĻš āĻŦāĻŋāĻ¨āĻžāĻŽā§‚āĻ˛ā§āĻ¯ā§‡ āĻļāĻ‚āĻ¸āĻžāĻĒāĻ¤ā§āĻ° āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻ•āĻ°ā§‡āĨ¤ āĻĒāĻ°āĻŋāĻˇā§‡āĻŦāĻžāĻŸāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯, āĻ†āĻĒāĻ¨āĻžāĻ° āĻāĻ•āĻŸāĻŋ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻœ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ autocert.

āĻāĻŸāĻŋ āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ° āĻ•āĻ°āĻžāĻ° āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻ¸āĻšāĻœ āĻ‰āĻĒāĻžāĻ¯āĻŧ āĻšāĻ˛ autocert.NewListener āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻŸāĻŋ http.Serve-āĻāĻ° āĻ¸āĻžāĻĨā§‡ āĻāĻ•āĻ¤ā§āĻ°ā§‡ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻžāĨ¤ HTTP āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻ…āĻ¨ā§āĻ°ā§‹āĻ§āĻ—ā§āĻ˛āĻŋ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻ•āĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻŸāĻŋ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ TLS āĻļāĻ‚āĻ¸āĻžāĻĒāĻ¤ā§āĻ°āĻ—ā§āĻ˛āĻŋ āĻĒā§āĻ°āĻžāĻĒā§āĻ¤ āĻāĻŦāĻ‚ āĻ†āĻĒāĻĄā§‡āĻŸ āĻ•āĻ°āĻžāĻ° āĻ…āĻ¨ā§āĻŽāĻ¤āĻŋ āĻĻā§‡āĻ¯āĻŧ:

http.Serve(autocert.NewListener("example.com"), nil)

āĻ†āĻŽāĻ°āĻž āĻ¯āĻĻāĻŋ āĻŦā§āĻ°āĻžāĻ‰āĻœāĻžāĻ°ā§‡ āĻ“āĻĒā§‡āĻ¨ āĻ•āĻ°āĻŋ example.com, āĻ†āĻŽāĻ°āĻž āĻāĻ•āĻŸāĻŋ HTTPS āĻĒā§āĻ°āĻ¤āĻŋāĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻĒāĻžāĻŦ "āĻšā§āĻ¯āĻžāĻ˛ā§‹, āĻŦāĻŋāĻļā§āĻŦ!"

āĻ†āĻĒāĻ¨āĻžāĻ° āĻ¯āĻĻāĻŋ āĻ†āĻ°āĻ“ āĻŦāĻŋāĻ¸ā§āĻ¤āĻžāĻ°āĻŋāĻ¤ āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ°ā§‡āĻļāĻ¨ā§‡āĻ° āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ āĻšāĻ¯āĻŧ, āĻ¤āĻžāĻšāĻ˛ā§‡ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ autocert.Manager āĻŽā§āĻ¯āĻžāĻ¨ā§‡āĻœāĻžāĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤ āĻ¤āĻžāĻ°āĻĒāĻ°ā§‡ āĻ†āĻŽāĻ°āĻž āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ¨āĻŋāĻœāĻ¸ā§āĻŦ http.Server āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻŋ (āĻāĻ–āĻ¨ āĻĒāĻ°ā§āĻ¯āĻ¨ā§āĻ¤ āĻ†āĻŽāĻ°āĻž āĻāĻŸāĻŋ āĻĄāĻŋāĻĢāĻ˛ā§āĻŸāĻ°ā§‚āĻĒā§‡ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŋ) āĻāĻŦāĻ‚ āĻŽā§āĻ¯āĻžāĻ¨ā§‡āĻœāĻžāĻ°āĻŸāĻŋāĻ•ā§‡ TLSConfig āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡ āĻ¯ā§āĻ•ā§āĻ¤ āĻ•āĻ°āĻŋ:

m := &autocert.Manager{
Cache:      autocert.DirCache("golang-autocert"),
Prompt:     autocert.AcceptTOS,
HostPolicy: autocert.HostWhitelist("example.org", "www.example.org"),
}
server := &http.Server{
    Addr:      ":443",
    TLSConfig: m.TLSConfig(),
}
server.ListenAndServeTLS("", "")

āĻ¸ā§āĻŦāĻ¯āĻŧāĻ‚āĻ•ā§āĻ°āĻŋāĻ¯āĻŧ āĻļāĻ‚āĻ¸āĻžāĻĒāĻ¤ā§āĻ° āĻĒā§āĻ¨āĻ°ā§āĻ¨āĻŦā§€āĻ•āĻ°āĻŖ āĻ¸āĻš āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ HTTPS āĻ¸āĻŽāĻ°ā§āĻĨāĻ¨ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ā§‡āĻ° āĻāĻŸāĻŋ āĻāĻ•āĻŸāĻŋ āĻ¸āĻšāĻœ āĻ‰āĻĒāĻžāĻ¯āĻŧāĨ¤

āĻ•āĻžāĻ¸ā§āĻŸāĻŽ āĻ°ā§āĻŸ āĻ¯ā§‹āĻ— āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡

āĻ¸ā§āĻŸā§āĻ¯āĻžāĻ¨ā§āĻĄāĻžāĻ°ā§āĻĄ āĻ˛āĻžāĻ‡āĻŦā§āĻ°ā§‡āĻ°āĻŋāĻ¤ā§‡ āĻ…āĻ¨ā§āĻ¤āĻ°ā§āĻ­ā§āĻ•ā§āĻ¤ āĻĄāĻŋāĻĢāĻ˛ā§āĻŸ āĻ°āĻžāĻ‰āĻŸāĻžāĻ°āĻŸāĻŋ āĻ­āĻžāĻ˛, āĻ¤āĻŦā§‡ āĻāĻŸāĻŋ āĻ–ā§āĻŦ āĻŽā§ŒāĻ˛āĻŋāĻ•āĨ¤ āĻŦā§‡āĻļāĻŋāĻ°āĻ­āĻžāĻ— āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ¨ā§‡āĻ¸ā§āĻŸā§‡āĻĄ āĻāĻŦāĻ‚ āĻ“āĻ¯āĻŧāĻžāĻ‡āĻ˛ā§āĻĄāĻ•āĻžāĻ°ā§āĻĄ āĻ°ā§āĻŸ āĻ¸āĻš āĻ†āĻ°āĻ“ āĻœāĻŸāĻŋāĻ˛ āĻ°āĻžāĻ‰āĻŸāĻŋāĻ‚ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨, āĻŦāĻž āĻĒāĻžāĻĨ āĻĒā§āĻ¯āĻžāĻŸāĻžāĻ°ā§āĻ¨ āĻāĻŦāĻ‚ āĻĒā§āĻ¯āĻžāĻ°āĻžāĻŽāĻŋāĻŸāĻžāĻ° āĻ¸ā§‡āĻŸ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĨ¤

āĻāĻ‡ āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡ āĻāĻŸāĻŋ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻœ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻŽā§‚āĻ˛ā§āĻ¯ āĻ—āĻ°āĻŋāĻ˛āĻž/āĻŽā§āĻ•ā§āĻ¸ и go-chi/chi. āĻ†āĻŽāĻ°āĻž āĻĒāĻ°ā§‡āĻ°āĻŸāĻŋāĻ° āĻ¸āĻžāĻĨā§‡ āĻ•ā§€āĻ­āĻžāĻŦā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻŦ āĻ¤āĻž āĻļāĻŋāĻ–āĻŦ - āĻāĻ•āĻŸāĻŋ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ āĻ¨ā§€āĻšā§‡ āĻĻā§‡āĻ–āĻžāĻ¨ā§‹ āĻšāĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤

āĻ†āĻŽāĻžāĻĻā§‡āĻ° API āĻāĻ° āĻœāĻ¨ā§āĻ¯ āĻ°ā§āĻŸ āĻ§āĻžāĻ°āĻŖāĻ•āĻžāĻ°ā§€ āĻĢāĻžāĻ‡āĻ˛ api/v1/api.go āĻĻā§‡āĻ“āĻ¯āĻŧāĻž āĻšāĻ˛:

/ HelloResponse is the JSON representation for a customized message
type HelloResponse struct {
Message string `json:"message"`
}
 
// HelloName returns a personalized JSON message
func HelloName(w http.ResponseWriter, r *http.Request) {
name := chi.URLParam(r, "name")
response := HelloResponse{
Message: fmt.Sprintf("Hello %s!", name),
}
jsonResponse(w, response, http.StatusOK)
}
 
// NewRouter returns an HTTP handler that implements the routes for the API
func NewRouter() http.Handler {
r := chi.NewRouter()
r.Get("/{name}", HelloName)
return r
}

āĻ†āĻŽāĻ°āĻž āĻŽā§‚āĻ˛ āĻĢāĻžāĻ‡āĻ˛ā§‡ āĻ°ā§āĻŸā§‡āĻ° āĻœāĻ¨ā§āĻ¯ api/vq āĻ‰āĻĒāĻ¸āĻ°ā§āĻ— āĻ¸ā§‡āĻŸ āĻ•āĻ°āĻŋāĨ¤

āĻ¤āĻžāĻ°āĻĒāĻ°ā§‡ āĻ†āĻŽāĻ°āĻž āĻāĻŸāĻŋāĻ•ā§‡ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻŽā§‚āĻ˛ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨āĻŸāĻŋāĻ¤ā§‡ api/v1/ āĻ‰āĻĒāĻ¸āĻ°ā§āĻ—ā§‡āĻ° āĻ…āĻ§ā§€āĻ¨ā§‡ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻĒā§āĻ°āĻ§āĻžāĻ¨ āĻ°āĻžāĻ‰āĻŸāĻžāĻ°ā§‡ āĻŽāĻžāĻ‰āĻ¨ā§āĻŸ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋ:

// NewRouter returns a new HTTP handler that implements the main server routes
func NewRouter() http.Handler {
router := chi.NewRouter()
    router.Mount("/api/v1/", v1.NewRouter())
    return router
}
http.Serve(autocert.NewListener("example.com"), NewRouter())

āĻœāĻŸāĻŋāĻ˛ āĻ°ā§āĻŸā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻžāĻ° āĻ¸āĻšāĻœāĻ¤āĻž āĻŦāĻĄāĻŧ, āĻœāĻŸāĻŋāĻ˛ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨āĻ—ā§āĻ˛āĻŋāĻ° āĻ—āĻ āĻ¨ āĻāĻŦāĻ‚ āĻ°āĻ•ā§āĻˇāĻŖāĻžāĻŦā§‡āĻ•ā§āĻˇāĻŖāĻ•ā§‡ āĻ¸āĻšāĻœ āĻ•āĻ°ā§‡ āĻ¤ā§‹āĻ˛ā§‡āĨ¤

āĻŽāĻŋāĻĄāĻ˛āĻ“āĻ¯āĻŧā§āĻ¯āĻžāĻ°ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻž

āĻ¸ā§āĻŸā§‡āĻœāĻŋāĻ‚ āĻāĻ° āĻ¸āĻžāĻĨā§‡ āĻāĻ•āĻŸāĻŋ HTTP āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻ˛āĻžāĻ°āĻ•ā§‡ āĻ…āĻ¨ā§āĻ¯āĻŸāĻŋāĻ° āĻ¸āĻžāĻĨā§‡ āĻŽā§‹āĻĄāĻŧāĻžāĻ¨ā§‹ āĻœāĻĄāĻŧāĻŋāĻ¤, āĻāĻŸāĻŋ āĻĻā§āĻ°ā§āĻ¤ āĻĒā§āĻ°āĻŽāĻžāĻŖā§€āĻ•āĻ°āĻŖ, āĻ•āĻŽā§āĻĒā§āĻ°ā§‡āĻļāĻ¨, āĻ˛āĻ—āĻŋāĻ‚ āĻāĻŦāĻ‚ āĻ…āĻ¨ā§āĻ¯āĻžāĻ¨ā§āĻ¯ āĻŦā§‡āĻļ āĻ•āĻ¯āĻŧā§‡āĻ•āĻŸāĻŋ āĻĢāĻžāĻ‚āĻļāĻ¨ āĻ¸āĻŽā§āĻĒāĻžāĻĻāĻ¨ āĻ•āĻ°āĻž āĻ¸āĻŽā§āĻ­āĻŦ āĻ•āĻ°ā§‡ āĻ¤ā§‹āĻ˛ā§‡āĨ¤

āĻāĻ•āĻŸāĻŋ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ āĻšāĻŋāĻ¸āĻžāĻŦā§‡, āĻ†āĻ¸ā§āĻ¨ http.Handler āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻĢā§‡āĻ¸āĻŸāĻŋ āĻĻā§‡āĻ–āĻŋ; āĻ†āĻŽāĻ°āĻž āĻāĻŸāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŦ āĻāĻ•āĻŸāĻŋ āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻ˛āĻžāĻ° āĻ˛āĻŋāĻ–āĻ¤ā§‡ āĻ¯āĻž āĻĒāĻ°āĻŋāĻˇā§‡āĻŦāĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻĻā§‡āĻ° āĻĒā§āĻ°āĻŽāĻžāĻŖā§€āĻ•āĻ°āĻŖ āĻ•āĻ°ā§‡āĨ¤

func RequireAuthentication(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        if !isAuthenticated(r) {
            http.Redirect(w, r, "/login", http.StatusTemporaryRedirect)
            return
        }
        // Assuming authentication passed, run the original handler
        next.ServeHTTP(w, r)
    })
}

āĻĨāĻžāĻ°ā§āĻĄ āĻĒāĻžāĻ°ā§āĻŸāĻŋ āĻ°āĻžāĻ‰āĻŸāĻžāĻ° āĻ†āĻ›ā§‡, āĻ¯ā§‡āĻŽāĻ¨ chi, āĻ¯āĻž āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻŽāĻŋāĻĄāĻ˛āĻ“āĻ¯āĻŧā§āĻ¯āĻžāĻ° āĻ•āĻžāĻ°ā§āĻ¯āĻ•āĻžāĻ°āĻŋāĻ¤āĻž āĻĒā§āĻ°āĻ¸āĻžāĻ°āĻŋāĻ¤ āĻ•āĻ°āĻ¤ā§‡ āĻĻā§‡āĻ¯āĻŧāĨ¤

āĻ¸ā§āĻŸā§āĻ¯āĻžāĻŸāĻŋāĻ• āĻĢāĻžāĻ‡āĻ˛ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻž

Go āĻ¸ā§āĻŸā§āĻ¯āĻžāĻ¨ā§āĻĄāĻžāĻ°ā§āĻĄ āĻ˛āĻžāĻ‡āĻŦā§āĻ°ā§‡āĻ°āĻŋāĻ¤ā§‡ āĻ›āĻŦāĻŋ, āĻœāĻžāĻ­āĻžāĻ¸ā§āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸ āĻāĻŦāĻ‚ CSS āĻĢāĻžāĻ‡āĻ˛ āĻ¸āĻš āĻ¸ā§āĻŸā§āĻ¯āĻžāĻŸāĻŋāĻ• āĻ•āĻ¨ā§āĻŸā§‡āĻ¨ā§āĻŸā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻžāĻ° āĻ•ā§āĻˇāĻŽāĻ¤āĻž āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤ āĻāĻ—ā§āĻ˛āĻŋ http.FileServer āĻĢāĻžāĻ‚āĻļāĻ¨ā§‡āĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻ…ā§āĻ¯āĻžāĻ•ā§āĻ¸ā§‡āĻ¸ āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤ āĻāĻŸāĻŋ āĻāĻ•āĻŸāĻŋ āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻ˛āĻžāĻ° āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻ•āĻ°ā§‡ āĻ¯āĻž āĻāĻ•āĻŸāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻĄāĻŋāĻ°ā§‡āĻ•ā§āĻŸāĻ°āĻŋ āĻĨā§‡āĻ•ā§‡ āĻĢāĻžāĻ‡āĻ˛ āĻĒāĻ°āĻŋāĻŦā§‡āĻļāĻ¨ āĻ•āĻ°ā§‡āĨ¤

func NewRouter() http.Handler {
    router := chi.NewRouter()
    r.Get("/{name}", HelloName)
 
// НаŅŅ‚Ņ€ĐžĐšĐēĐ° Ņ€Đ°ĐˇĐ´Đ°Ņ‡Đ¸ ŅŅ‚Đ°Ņ‚иŅ‡ĐĩŅĐēиŅ… Ņ„Đ°ĐšĐģОв
staticPath, _ := filepath.Abs("../../static/")
fs := http.FileServer(http.Dir(staticPath))
    router.Handle("/*", fs)
    
    return r

āĻāĻŸāĻž āĻ…āĻŦāĻļā§āĻ¯āĻ‡ āĻŽāĻ¨ā§‡ āĻ°āĻžāĻ–āĻž āĻ‰āĻšāĻŋāĻ¤ āĻ¯ā§‡ http.Dir āĻĄāĻŋāĻ°ā§‡āĻ•ā§āĻŸāĻ°āĻŋāĻ° āĻŦāĻŋāĻˇāĻ¯āĻŧāĻŦāĻ¸ā§āĻ¤ā§ āĻĒā§āĻ°āĻĻāĻ°ā§āĻļāĻ¨ āĻ•āĻ°ā§‡ āĻ¯āĻĻāĻŋ āĻāĻ¤ā§‡ āĻĒā§āĻ°āĻ§āĻžāĻ¨ index.html āĻĢāĻžāĻ‡āĻ˛ āĻ¨āĻž āĻĨāĻžāĻ•ā§‡āĨ¤ āĻāĻ‡ āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡, āĻĄāĻŋāĻ°ā§‡āĻ•ā§āĻŸāĻ°āĻŋāĻ•ā§‡ āĻ†āĻĒā§‹āĻ¸ āĻ•āĻ°āĻž āĻĨā§‡āĻ•ā§‡ āĻ†āĻŸāĻ•āĻžāĻ¤ā§‡, āĻ†āĻĒāĻ¨āĻžāĻ° āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻœāĻŸāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻ‰āĻšāĻŋāĻ¤ unindexed.

āĻ¸āĻ āĻŋāĻ• āĻļāĻžāĻŸāĻĄāĻžāĻ‰āĻ¨

āĻ—ā§‹-āĻ¤ā§‡ HTTP āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡āĻ° āĻ—ā§āĻ°ā§‡āĻ¸āĻĢā§āĻ˛ āĻļāĻžāĻŸāĻĄāĻžāĻ‰āĻ¨ āĻ¨āĻžāĻŽā§‡ āĻāĻ•āĻŸāĻŋ āĻŦā§ˆāĻļāĻŋāĻˇā§āĻŸā§āĻ¯ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤ āĻāĻŸāĻŋ Shutdown() āĻĒāĻĻā§āĻ§āĻ¤āĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻāĻ•āĻŸāĻŋ āĻ—ā§‹āĻ°ā§āĻŸāĻŋāĻ¨ā§‡ āĻļā§āĻ°ā§ āĻšāĻ¯āĻŧ, āĻāĻŦāĻ‚ āĻ¤āĻžāĻ°āĻĒāĻ° āĻšā§āĻ¯āĻžāĻ¨ā§‡āĻ˛āĻŸāĻŋ āĻāĻ•āĻŸāĻŋ āĻŦāĻžāĻ§āĻž āĻ¸āĻ‚āĻ•ā§‡āĻ¤ āĻĒāĻžāĻ“āĻ¯āĻŧāĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻļā§‹āĻ¨āĻž āĻšāĻ¯āĻŧāĨ¤ āĻ¸āĻ‚āĻ•ā§‡āĻ¤ āĻĒāĻžāĻ“āĻ¯āĻŧāĻžāĻ° āĻ¸āĻžāĻĨā§‡ āĻ¸āĻžāĻĨā§‡ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°āĻŸāĻŋ āĻŦāĻ¨ā§āĻ§ āĻšāĻ¯āĻŧā§‡ āĻ¯āĻžāĻ¯āĻŧ, āĻ¤āĻŦā§‡ āĻ…āĻŦāĻŋāĻ˛āĻŽā§āĻŦā§‡ āĻ¨āĻ¯āĻŧ, āĻ•āĻ¯āĻŧā§‡āĻ• āĻ¸ā§‡āĻ•ā§‡āĻ¨ā§āĻĄ āĻĒāĻ°ā§‡āĨ¤

handler := server.NewRouter()
srv := &http.Server{
    Handler: handler,
}
 
go func() {
srv.Serve(autocert.NewListener(domains...))
}()
 
// Wait for an interrupt
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt)
<-c
 
// Attempt a graceful shutdown
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
srv.Shutdown(ctx)

āĻāĻ•āĻŸāĻŋ āĻ‰āĻĒāĻ¸āĻ‚āĻšāĻžāĻ° āĻšāĻŋāĻ¸āĻžāĻŦā§‡

āĻĒā§āĻ°āĻžāĻ¯āĻŧ āĻ¸āĻ°ā§āĻŦāĻœāĻ¨ā§€āĻ¨ āĻ¸ā§āĻŸā§āĻ¯āĻžāĻ¨ā§āĻĄāĻžāĻ°ā§āĻĄ āĻ˛āĻžāĻ‡āĻŦā§āĻ°ā§‡āĻ°āĻŋ āĻ¸āĻš Go āĻāĻ•āĻŸāĻŋ āĻļāĻ•ā§āĻ¤āĻŋāĻļāĻžāĻ˛ā§€ āĻ­āĻžāĻˇāĻžāĨ¤ āĻāĻ° āĻĄāĻŋāĻĢāĻ˛ā§āĻŸ āĻ•ā§āĻˇāĻŽāĻ¤āĻžāĻ—ā§āĻ˛āĻŋ āĻ–ā§āĻŦ āĻĒā§āĻ°āĻļāĻ¸ā§āĻ¤, āĻāĻŦāĻ‚ āĻ¸ā§‡āĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻĢā§‡āĻ¸ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ‰āĻ¨ā§āĻ¨āĻ¤ āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ - āĻāĻŸāĻŋ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻ¸āĻ¤ā§āĻ¯āĻŋāĻ•āĻžāĻ°ā§‡āĻ° āĻ¨āĻŋāĻ°ā§āĻ­āĻ°āĻ¯ā§‹āĻ—ā§āĻ¯ HTTP āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°āĻ—ā§āĻ˛āĻŋ āĻŦāĻŋāĻ•āĻžāĻļ āĻ•āĻ°āĻ¤ā§‡ āĻĻā§‡āĻ¯āĻŧā§ˇ

Skillbox āĻ¸ā§āĻĒāĻžāĻ°āĻŋāĻļ āĻ•āĻ°ā§‡:

āĻ‰āĻ¤ā§āĻ¸: www.habr.com

āĻāĻ•āĻŸāĻŋ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻœā§āĻĄāĻŧā§āĻ¨