แƒ•แƒ”แƒ‘ แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒก แƒ’แƒแƒœแƒ•แƒ˜แƒ—แƒแƒ แƒ”แƒ‘แƒ Golang-แƒจแƒ˜ - แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜แƒ“แƒแƒœ แƒ แƒ—แƒฃแƒšแƒแƒ›แƒ“แƒ”

แƒ•แƒ”แƒ‘ แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒก แƒ’แƒแƒœแƒ•แƒ˜แƒ—แƒแƒ แƒ”แƒ‘แƒ Golang-แƒจแƒ˜ - แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜แƒ“แƒแƒœ แƒ แƒ—แƒฃแƒšแƒแƒ›แƒ“แƒ”

แƒฎแƒฃแƒ—แƒ˜ แƒฌแƒšแƒ˜แƒก แƒฌแƒ˜แƒœ แƒ“แƒแƒ•แƒ˜แƒฌแƒงแƒ” แƒ’แƒแƒคแƒจแƒ˜แƒก แƒ’แƒแƒœแƒ•แƒ˜แƒ—แƒแƒ แƒ”แƒ‘แƒ, แƒแƒ›แƒแƒœ แƒ’แƒแƒšแƒแƒœแƒ’แƒ˜แƒก แƒจแƒ”แƒกแƒฌแƒแƒ•แƒšแƒ˜แƒก แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒšแƒแƒ‘แƒ แƒ›แƒ˜แƒกแƒชแƒ. แƒ›แƒ˜แƒ•แƒฎแƒ•แƒ“แƒ˜, แƒ แƒแƒ› Go แƒแƒ แƒ˜แƒก แƒซแƒšแƒ˜แƒ”แƒ แƒ˜ แƒ”แƒœแƒ, แƒ แƒแƒ›แƒ”แƒšแƒกแƒแƒช แƒแƒ•แƒกแƒ”แƒ‘แƒก แƒ›แƒ แƒแƒ•แƒแƒšแƒ˜ แƒ‘แƒ˜แƒ‘แƒšแƒ˜แƒแƒ—แƒ”แƒ™แƒ. Go แƒแƒ แƒ˜แƒก แƒ›แƒ แƒแƒ•แƒแƒšแƒ›แƒฎแƒ แƒ˜แƒ•แƒ˜: แƒ™แƒ”แƒ แƒซแƒแƒ“, แƒ˜แƒก แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒฃแƒš แƒ˜แƒฅแƒœแƒแƒก แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒก แƒ›แƒฎแƒแƒ แƒ”แƒก แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฅแƒ›แƒœแƒ”แƒšแƒแƒ“ แƒฃแƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒแƒ“.

แƒ”แƒก แƒกแƒขแƒแƒขแƒ˜แƒ แƒ”แƒฎแƒ”แƒ‘แƒ แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒก แƒ“แƒแƒฌแƒ”แƒ แƒแƒก Go-แƒจแƒ˜. แƒ“แƒแƒ•แƒ˜แƒฌแƒงแƒแƒ— แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜ แƒ แƒแƒฆแƒแƒชแƒ”แƒ‘แƒ˜แƒ—, แƒ แƒแƒ’แƒแƒ แƒ˜แƒชแƒแƒ "Hello World!" แƒ“แƒ แƒ“แƒแƒ•แƒแƒกแƒ แƒฃแƒšแƒแƒ— แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒ— แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜ แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒšแƒแƒ‘แƒ”แƒ‘แƒ˜แƒ—:

- Let's Encrypt-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ HTTPS-แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก.
- แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก API แƒ แƒแƒฃแƒขแƒ”แƒ แƒแƒ“.
- แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ แƒจแƒฃแƒ แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ”แƒ‘แƒ—แƒแƒœ.
- แƒกแƒขแƒแƒขแƒ˜แƒ™แƒฃแƒ แƒ˜ แƒคแƒแƒ˜แƒšแƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ.
- แƒกแƒฌแƒแƒ แƒ˜ แƒ’แƒแƒ›แƒแƒ แƒ—แƒ•แƒ.

Skillbox แƒ’แƒ˜แƒ แƒฉแƒ”แƒ•แƒ—: แƒžแƒ แƒแƒฅแƒขแƒ˜แƒ™แƒฃแƒšแƒ˜ แƒ™แƒฃแƒ แƒกแƒ˜ "แƒžแƒ˜แƒ—แƒแƒœแƒ˜แƒก แƒ“แƒ”แƒ•แƒ”แƒšแƒแƒžแƒ”แƒ แƒ˜ แƒœแƒฃแƒšแƒ˜แƒ“แƒแƒœ".

แƒจแƒ”แƒ’แƒแƒฎแƒกแƒ”แƒœแƒ”แƒ‘แƒ—: "Habr"-แƒ˜แƒก แƒงแƒ•แƒ”แƒšแƒ แƒ›แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ”แƒšแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก - แƒคแƒแƒกแƒ“แƒแƒ™แƒšแƒ”แƒ‘แƒ 10 แƒ แƒฃแƒ‘แƒšแƒ˜แƒ“แƒแƒœ Skillbox-แƒ˜แƒก แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ  แƒ™แƒฃแƒ แƒกแƒ–แƒ” แƒฉแƒแƒ แƒ˜แƒชแƒฎแƒ•แƒ˜แƒกแƒแƒก "Habr" แƒกแƒแƒ แƒ”แƒ™แƒšแƒแƒ›แƒ แƒ™แƒแƒ“แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—.

แฒ’แƒแƒ›แƒแƒ แƒฏแƒแƒ‘แƒ แƒ›แƒกแƒแƒคแƒšแƒ˜แƒ!

แƒ—แƒฅแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒจแƒ”แƒฅแƒ›แƒœแƒแƒ— แƒ•แƒ”แƒ‘ แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜ Go-แƒจแƒ˜ แƒซแƒแƒšแƒ˜แƒแƒœ แƒกแƒฌแƒ แƒแƒคแƒแƒ“. แƒแƒฅ แƒ›แƒแƒชแƒ”แƒ›แƒฃแƒšแƒ˜แƒ แƒ“แƒแƒ›แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒšแƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒก แƒ–แƒ”แƒ›แƒแƒ— แƒ“แƒแƒžแƒ˜แƒ แƒ”แƒ‘แƒฃแƒš โ€žHello, World!โ€œ-แƒก.

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)
}

แƒแƒ›แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ—แƒฃ แƒ’แƒแƒฃแƒจแƒ•แƒ˜แƒ— แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ แƒ“แƒ แƒ’แƒแƒฎแƒกแƒ”แƒœแƒ˜แƒ— แƒ’แƒ•แƒ”แƒ แƒ“แƒ˜ localhost, แƒ›แƒแƒจแƒ˜แƒœแƒ•แƒ” แƒ“แƒแƒ˜แƒœแƒแƒฎแƒแƒ•แƒ— แƒขแƒ”แƒฅแƒกแƒขแƒก "แƒ’แƒแƒ›แƒแƒ แƒฏแƒแƒ‘แƒ, แƒกแƒแƒ›แƒงแƒแƒ แƒ!" (แƒ—แƒฃ แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒกแƒฌแƒแƒ แƒแƒ“ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก, แƒ แƒ แƒ—แƒฅแƒ›แƒ แƒฃแƒœแƒ“แƒ).

แƒฉแƒ•แƒ”แƒœ แƒ›แƒแƒ’แƒ•แƒ˜แƒแƒœแƒ”แƒ‘แƒ˜แƒ— แƒ›แƒ แƒแƒ•แƒแƒšแƒฏแƒ”แƒ  แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ— แƒ“แƒแƒ›แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ”แƒšแƒก, แƒ›แƒแƒ’แƒ แƒแƒ› แƒฏแƒ”แƒ  แƒ’แƒแƒ•แƒ˜แƒ’แƒแƒ—, แƒ แƒแƒ’แƒแƒ  แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜.

net/http

แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒจแƒ˜ แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒžแƒแƒ™แƒ”แƒขแƒ˜ net/http, แƒ˜แƒก แƒแƒ แƒ˜แƒก แƒ›แƒ—แƒแƒ•แƒแƒ แƒ˜ แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒ›แƒ”แƒœแƒขแƒ˜ Go-แƒจแƒ˜ แƒ แƒแƒ’แƒแƒ แƒช แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ”แƒ‘แƒ˜แƒก, แƒแƒกแƒ”แƒ•แƒ” HTTP แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒœแƒ•แƒ˜แƒ—แƒแƒ แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒ™แƒแƒ“แƒ˜แƒก แƒ’แƒแƒกแƒแƒ’แƒ”แƒ‘แƒแƒ“, แƒ›แƒแƒ“แƒ˜แƒ— แƒ’แƒแƒ•แƒ˜แƒ’แƒแƒ— แƒกแƒแƒ›แƒ˜ แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ•แƒแƒœแƒ˜ แƒ”แƒšแƒ”แƒ›แƒ”แƒœแƒขแƒ˜แƒก แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ: http.Handler, http.ServeMux แƒ“แƒ http.Server.

HTTP แƒ“แƒแƒ›แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒšแƒ”แƒ‘แƒ˜

แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒ•แƒ˜แƒฆแƒ”แƒ‘แƒ— แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒแƒก, แƒ“แƒแƒ›แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ”แƒšแƒ˜ แƒแƒแƒœแƒแƒšแƒ˜แƒ–แƒ”แƒ‘แƒก แƒ›แƒแƒก แƒ“แƒ แƒฅแƒ›แƒœแƒ˜แƒก แƒžแƒแƒกแƒฃแƒฎแƒก. Handlers in Go แƒ“แƒแƒœแƒ”แƒ แƒ’แƒ˜แƒšแƒ˜แƒ แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒœแƒแƒ˜แƒ แƒแƒ“:

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

แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜ แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒก http.HandleFunc แƒ“แƒแƒ›แƒฎแƒ›แƒแƒ แƒ” แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒแƒก. แƒ˜แƒก แƒแƒฎแƒ•แƒ”แƒ•แƒก แƒกแƒฎแƒ•แƒ แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒแƒก, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ—แƒแƒ•แƒ˜แƒก แƒ›แƒฎแƒ แƒ˜แƒ• แƒ˜แƒฆแƒ”แƒ‘แƒก http.ResponseWriter แƒ“แƒ http.Request-แƒก ServeHTTP-แƒจแƒ˜.

แƒกแƒฎแƒ•แƒ แƒกแƒ˜แƒขแƒงแƒ•แƒ”แƒ‘แƒ˜แƒ— แƒ แƒแƒ› แƒ•แƒ—แƒฅแƒ•แƒแƒ—, Golang-แƒจแƒ˜ แƒ“แƒแƒ›แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒšแƒ”แƒ‘แƒ˜ แƒฌแƒแƒ แƒ›แƒแƒ“แƒ’แƒ”แƒœแƒ˜แƒšแƒ˜แƒ แƒ”แƒ แƒ— แƒ˜แƒœแƒขแƒ”แƒ แƒคแƒ”แƒ˜แƒกแƒจแƒ˜, แƒ แƒแƒช แƒฃแƒแƒ›แƒ แƒแƒ• แƒ•แƒแƒ แƒ˜แƒแƒœแƒขแƒก แƒแƒซแƒšแƒ”แƒ•แƒก แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ˜แƒกแƒขแƒก. แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒจแƒฃแƒ แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ แƒ“แƒแƒœแƒ”แƒ แƒ’แƒ˜แƒšแƒ˜แƒ แƒ“แƒแƒ›แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒšแƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—, แƒกแƒแƒ“แƒแƒช ServeHTTP แƒฏแƒ”แƒ  แƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒก แƒ แƒแƒฆแƒแƒชแƒแƒก แƒ“แƒ แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒฃแƒฌแƒแƒ“แƒ”แƒ‘แƒก แƒกแƒฎแƒ•แƒ แƒ“แƒแƒ›แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒšแƒ˜แƒก ServeHTTP แƒ›แƒ”แƒ—แƒแƒ“แƒก.

แƒ แƒแƒ’แƒแƒ แƒช แƒ–แƒ”แƒ›แƒแƒ— แƒแƒฆแƒ˜แƒœแƒ˜แƒจแƒœแƒ, แƒ“แƒแƒ›แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒšแƒ”แƒ‘แƒ˜ แƒฃแƒ‘แƒ แƒแƒšแƒแƒ“ แƒฅแƒ›แƒœแƒ˜แƒแƒœ แƒžแƒแƒกแƒฃแƒฎแƒ”แƒ‘แƒก แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ”แƒ‘แƒ–แƒ”. แƒ›แƒแƒ’แƒ แƒแƒ› แƒ แƒแƒ›แƒ”แƒšแƒ˜ แƒ™แƒแƒœแƒ™แƒ แƒ”แƒขแƒฃแƒšแƒ˜ แƒ“แƒแƒ›แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ”แƒšแƒ˜ แƒฃแƒœแƒ“แƒ แƒ˜แƒงแƒแƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ“แƒ แƒแƒ˜แƒก แƒ™แƒแƒœแƒ™แƒ แƒ”แƒขแƒฃแƒš แƒ›แƒแƒ›แƒ”แƒœแƒขแƒจแƒ˜?

แƒ›แƒแƒ˜แƒ—แƒฎแƒแƒ•แƒ”แƒ— แƒ›แƒแƒ แƒจแƒ แƒฃแƒขแƒ˜

แƒกแƒฌแƒแƒ แƒ˜ แƒแƒ แƒฉแƒ”แƒ•แƒแƒœแƒ˜แƒก แƒ’แƒแƒกแƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒšแƒแƒ“ แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ— HTTP แƒ›แƒฃแƒšแƒขแƒ˜แƒžแƒšแƒ”แƒฅแƒกแƒ”แƒ แƒ˜. แƒ แƒ˜แƒ’ แƒ‘แƒ˜แƒ‘แƒšแƒ˜แƒแƒ—แƒ”แƒ™แƒแƒจแƒ˜ แƒ›แƒแƒก muxer แƒแƒœ แƒ แƒแƒฃแƒขแƒ”แƒ แƒก แƒฃแƒฌแƒแƒ“แƒ”แƒ‘แƒ”แƒœ, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ˜แƒกแƒ˜แƒœแƒ˜ แƒงแƒ•แƒ”แƒšแƒ แƒ”แƒ แƒ—แƒ˜ แƒ“แƒ แƒ˜แƒ’แƒ˜แƒ•แƒ”แƒ. แƒ›แƒฃแƒšแƒขแƒ˜แƒžแƒšแƒ”แƒฅแƒกแƒ”แƒ แƒ˜แƒก แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒแƒ แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ˜แƒก แƒ‘แƒ˜แƒšแƒ˜แƒ™แƒ˜แƒก แƒแƒœแƒแƒšแƒ˜แƒ–แƒ˜ แƒ“แƒ แƒจแƒ”แƒกแƒแƒ‘แƒแƒ›แƒ˜แƒกแƒ˜ แƒ“แƒแƒ›แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒšแƒ˜แƒก แƒจแƒ”แƒ แƒฉแƒ”แƒ•แƒ.

แƒ—แƒฃ แƒ’แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒแƒ— แƒ›แƒฎแƒแƒ แƒ“แƒแƒญแƒ”แƒ แƒ แƒ แƒ—แƒฃแƒšแƒ˜ แƒ›แƒแƒ แƒจแƒ แƒฃแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒฃแƒ›แƒฏแƒแƒ‘แƒ”แƒกแƒ˜แƒ แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒแƒ— แƒ›แƒ”แƒกแƒแƒ›แƒ” แƒ›แƒฎแƒแƒ แƒ˜แƒก แƒ‘แƒ˜แƒ‘แƒšแƒ˜แƒแƒ—แƒ”แƒ™แƒ”แƒ‘แƒ˜. แƒ–แƒแƒ’แƒ˜แƒ”แƒ แƒ—แƒ˜ แƒงแƒ•แƒ”แƒšแƒแƒ–แƒ” แƒ›แƒแƒฌแƒ˜แƒœแƒแƒ•แƒ” - แƒ’แƒแƒ แƒ˜แƒšแƒ/แƒ›แƒฃแƒฅแƒกแƒ˜ ะธ แƒ’แƒ-แƒฉแƒ˜/แƒฉแƒ˜, แƒ”แƒก แƒ‘แƒ˜แƒ‘แƒšแƒ˜แƒแƒ—แƒ”แƒ™แƒ”แƒ‘แƒ˜ แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒก แƒฎแƒ“แƒ˜แƒก แƒจแƒฃแƒแƒšแƒ”แƒ“แƒฃแƒ แƒ˜ แƒ“แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ˜แƒก แƒฃแƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒแƒ“ แƒ’แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒแƒก. แƒ›แƒแƒ—แƒ˜ แƒ“แƒแƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒ˜แƒ— แƒ—แƒฅแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ“แƒแƒแƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒ˜แƒ แƒแƒ— wildcard-แƒ˜แƒก แƒ›แƒแƒ แƒจแƒ แƒฃแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ แƒ“แƒ แƒจแƒ”แƒแƒกแƒ แƒฃแƒšแƒแƒ— แƒ›แƒ แƒแƒ•แƒแƒšแƒ˜ แƒกแƒฎแƒ•แƒ แƒ“แƒแƒ•แƒแƒšแƒ”แƒ‘แƒ. แƒ›แƒแƒ—แƒ˜ แƒฃแƒžแƒ˜แƒ แƒแƒขแƒ”แƒกแƒแƒ‘แƒ แƒแƒ แƒ˜แƒก แƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒแƒ“แƒแƒ‘แƒ แƒกแƒขแƒแƒœแƒ“แƒแƒ แƒขแƒฃแƒšแƒ˜ HTTP แƒ“แƒแƒ›แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒšแƒ”แƒ‘แƒ—แƒแƒœ. แƒจแƒ”แƒ“แƒ”แƒ’แƒแƒ“, แƒ—แƒฅแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ“แƒแƒฌแƒ”แƒ แƒแƒ— แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜ แƒ™แƒแƒ“แƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒจแƒ”แƒ˜แƒชแƒ•แƒแƒšแƒแƒก แƒ›แƒแƒ›แƒแƒ•แƒแƒšแƒจแƒ˜.

แƒœแƒแƒ แƒ›แƒแƒšแƒฃแƒ  แƒกแƒ˜แƒขแƒฃแƒแƒชแƒ˜แƒแƒจแƒ˜ แƒ แƒ—แƒฃแƒš แƒฉแƒแƒ แƒฉแƒแƒ”แƒ‘แƒ—แƒแƒœ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ แƒ›แƒแƒ˜แƒ—แƒฎแƒแƒ•แƒก แƒแƒ แƒแƒกแƒขแƒแƒœแƒ“แƒแƒ แƒขแƒฃแƒš แƒ’แƒแƒ“แƒแƒฌแƒงแƒ•แƒ”แƒขแƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒก แƒ“แƒ แƒ”แƒก แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ•แƒœแƒแƒ“ แƒแƒ แƒ—แƒฃแƒšแƒ”แƒ‘แƒก แƒœแƒแƒ’แƒฃแƒšแƒ˜แƒกแƒฎแƒ›แƒ”แƒ•แƒ˜ แƒ“แƒแƒ›แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒšแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒแƒก. แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒ“แƒ˜แƒ“แƒ˜ แƒฃแƒ›แƒ แƒแƒ•แƒšแƒ”แƒกแƒแƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฅแƒ›แƒœแƒ”แƒšแƒแƒ“ แƒกแƒแƒ™แƒ›แƒแƒ แƒ˜แƒกแƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒœแƒแƒ’แƒฃแƒšแƒ˜แƒกแƒฎแƒ›แƒ”แƒ•แƒ˜ แƒ‘แƒ˜แƒ‘แƒšแƒ˜แƒแƒ—แƒ”แƒ™แƒ˜แƒกแƒ แƒ“แƒ แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜ แƒ แƒแƒฃแƒขแƒ”แƒ แƒ˜แƒก แƒ™แƒแƒ›แƒ‘แƒ˜แƒœแƒแƒชแƒ˜แƒ.

แƒจแƒ”แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ˜แƒก แƒ“แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ

แƒ’แƒแƒ แƒ“แƒ แƒแƒ›แƒ˜แƒกแƒ, แƒฉแƒ•แƒ”แƒœ แƒ’แƒ•แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ แƒ™แƒแƒ›แƒžแƒแƒœแƒ”แƒœแƒขแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช โ€žแƒ›แƒแƒ˜แƒกแƒ›แƒ”แƒœแƒกโ€œ แƒจแƒ”แƒ›แƒแƒ›แƒแƒ•แƒแƒš แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒก แƒ“แƒ แƒ’แƒแƒ“แƒแƒ›แƒ˜แƒกแƒแƒ›แƒแƒ แƒ—แƒ”แƒ‘แƒก แƒงแƒ•แƒ”แƒšแƒ แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒแƒก แƒกแƒฌแƒแƒ  แƒ“แƒแƒ›แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ”แƒšแƒ–แƒ”. http.Server แƒแƒ“แƒ•แƒ˜แƒšแƒแƒ“ แƒฃแƒ›แƒ™แƒšแƒแƒ•แƒ“แƒ”แƒ‘แƒ แƒแƒ› แƒแƒ›แƒแƒชแƒแƒœแƒแƒก.

แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜ แƒ’แƒ•แƒ˜แƒฉแƒ•แƒ”แƒœแƒ”แƒ‘แƒก, แƒ แƒแƒ› แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜ แƒžแƒแƒกแƒฃแƒฎแƒ˜แƒกแƒ›แƒ’แƒ”แƒ‘แƒ”แƒšแƒ˜แƒ แƒงแƒ•แƒ”แƒšแƒ แƒ“แƒแƒ•แƒแƒšแƒ”แƒ‘แƒแƒ–แƒ”, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ“แƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜แƒก แƒ“แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒแƒกแƒ—แƒแƒœ. แƒ”แƒก, แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก TLS แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—. http.ListenAndServer แƒ–แƒแƒ แƒ˜แƒก แƒ’แƒแƒœแƒกแƒแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒšแƒแƒ“ แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ แƒกแƒขแƒแƒœแƒ“แƒแƒ แƒขแƒฃแƒšแƒ˜ HTTP แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜.

แƒแƒฎแƒšแƒ แƒ›แƒแƒ“แƒ˜แƒ— แƒจแƒ”แƒ•แƒฎแƒ”แƒ“แƒแƒ— แƒฃแƒคแƒ แƒ แƒ แƒ—แƒฃแƒš แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ”แƒ‘แƒก.

แƒ“แƒแƒ”แƒ›แƒแƒขแƒ”แƒ‘แƒ Let's Encrypt

แƒœแƒแƒ’แƒฃแƒšแƒ˜แƒกแƒฎแƒ›แƒ”แƒ•แƒแƒ“, แƒฉแƒ•แƒ”แƒœแƒ˜ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก HTTP แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ–แƒ”, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ แƒ”แƒ™แƒแƒ›แƒ”แƒœแƒ“แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ HTTPS แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ. แƒ”แƒก แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ’แƒแƒ™แƒ”แƒ—แƒ“แƒ”แƒก แƒฃแƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒแƒ“ Go-แƒจแƒ˜. แƒ—แƒฃ แƒ—แƒฅแƒ•แƒ”แƒœ แƒ›แƒ˜แƒ˜แƒฆแƒ”แƒ— แƒกแƒ”แƒ แƒ—แƒ˜แƒคแƒ˜แƒ™แƒแƒขแƒ˜ แƒ“แƒ แƒžแƒ˜แƒ แƒแƒ“แƒ˜ แƒ’แƒแƒกแƒแƒฆแƒ”แƒ‘แƒ˜, แƒ›แƒแƒจแƒ˜แƒœ แƒกแƒแƒ™แƒ›แƒแƒ แƒ˜แƒกแƒ˜แƒ แƒ“แƒแƒแƒ แƒ”แƒ’แƒ˜แƒกแƒขแƒ แƒ˜แƒ แƒแƒ— ListenAndServeTLS แƒกแƒฌแƒแƒ แƒ˜ แƒกแƒ”แƒ แƒขแƒ˜แƒคแƒ˜แƒ™แƒแƒขแƒ˜แƒ— แƒ“แƒ แƒ’แƒแƒกแƒแƒฆแƒ”แƒ‘แƒ˜แƒก แƒคแƒแƒ˜แƒšแƒ”แƒ‘แƒ˜แƒ—.

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

แƒ—แƒฅแƒ•แƒ”แƒœ แƒงแƒแƒ•แƒ”แƒšแƒ—แƒ•แƒ˜แƒก แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒฃแƒ™แƒ”แƒ—แƒ”แƒกแƒแƒ“ แƒ’แƒแƒแƒ™แƒ”แƒ—แƒแƒ—.

แƒ›แƒแƒ“แƒ˜แƒ— แƒ“แƒแƒแƒกแƒ แƒฃแƒšแƒ แƒ’แƒ—แƒแƒ•แƒแƒ–แƒแƒ‘แƒ— แƒฃแƒคแƒแƒกแƒ แƒกแƒ”แƒ แƒ—แƒ˜แƒคแƒ˜แƒ™แƒแƒขแƒ”แƒ‘แƒก แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒฃแƒ แƒ˜ แƒ’แƒแƒœแƒแƒฎแƒšแƒ”แƒ‘แƒ˜แƒ—. แƒกแƒ”แƒ แƒ•แƒ˜แƒกแƒ˜แƒ— แƒกแƒแƒ แƒ’แƒ”แƒ‘แƒšแƒแƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒกแƒแƒญแƒ˜แƒ แƒแƒ แƒžแƒแƒ™แƒ”แƒขแƒ˜ autocert.

แƒ›แƒ˜แƒกแƒ˜ แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ˜แƒก แƒฃแƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ”แƒกแƒ˜ แƒ’แƒ–แƒแƒ autocert.NewListener แƒ›แƒ”แƒ—แƒแƒ“แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ http.Serve-แƒ—แƒแƒœ แƒ”แƒ แƒ—แƒแƒ“. แƒ›แƒ”แƒ—แƒแƒ“แƒ˜ แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒ’แƒแƒซแƒšแƒ”แƒ•แƒ— แƒ›แƒ˜แƒ˜แƒฆแƒแƒ— แƒ“แƒ แƒ’แƒแƒœแƒแƒแƒฎแƒšแƒแƒ— TLS แƒกแƒ”แƒ แƒ—แƒ˜แƒคแƒ˜แƒ™แƒแƒขแƒ”แƒ‘แƒ˜, แƒกแƒแƒœแƒแƒ› HTTP แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜ แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒก แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ”แƒ‘แƒก:

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 แƒ›แƒฎแƒแƒ แƒ“แƒแƒญแƒ”แƒ แƒ˜แƒก แƒ’แƒแƒœแƒกแƒแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒšแƒแƒ“ แƒกแƒ”แƒ แƒขแƒ˜แƒคแƒ˜แƒ™แƒแƒขแƒ˜แƒก แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒฃแƒ แƒ˜ แƒ’แƒแƒœแƒแƒฎแƒšแƒ”แƒ‘แƒ˜แƒ—.

แƒ›แƒแƒ แƒ’แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ›แƒแƒ แƒจแƒ แƒฃแƒขแƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ

แƒœแƒแƒ’แƒฃแƒšแƒ˜แƒกแƒฎแƒ›แƒ”แƒ•แƒ˜ แƒ แƒแƒฃแƒขแƒ”แƒ แƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒจแƒ”แƒ“แƒ˜แƒก แƒกแƒขแƒแƒœแƒ“แƒแƒ แƒขแƒฃแƒš แƒ‘แƒ˜แƒ‘แƒšแƒ˜แƒแƒ—แƒ”แƒ™แƒแƒจแƒ˜, แƒ™แƒแƒ แƒ’แƒ˜แƒ, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ˜แƒก แƒซแƒแƒšแƒ˜แƒแƒœ แƒซแƒ˜แƒ แƒ˜แƒ—แƒแƒ“แƒ˜แƒ. แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒฃแƒ›แƒ”แƒขแƒ”แƒกแƒแƒ‘แƒแƒก แƒ”แƒกแƒแƒญแƒ˜แƒ แƒแƒ”แƒ‘แƒ แƒฃแƒคแƒ แƒ แƒ แƒ—แƒฃแƒšแƒ˜ แƒ›แƒแƒ แƒจแƒ แƒฃแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ, แƒ›แƒแƒ— แƒจแƒแƒ แƒ˜แƒก แƒฉแƒแƒ“แƒ’แƒ›แƒฃแƒšแƒ˜ แƒ“แƒ แƒ•แƒ”แƒšแƒฃแƒ แƒ˜ แƒ›แƒแƒ แƒจแƒ แƒฃแƒขแƒ”แƒ‘แƒ˜, แƒแƒœ แƒ‘แƒ˜แƒšแƒ˜แƒ™แƒ”แƒ‘แƒ˜แƒก แƒจแƒแƒ‘แƒšแƒแƒœแƒ”แƒ‘แƒ˜แƒกแƒ แƒ“แƒ แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒก แƒžแƒ แƒแƒชแƒ”แƒ“แƒฃแƒ แƒ.

แƒแƒ› แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜ แƒฆแƒ˜แƒ แƒก แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ แƒ’แƒแƒ แƒ˜แƒšแƒ/แƒ›แƒฃแƒฅแƒกแƒ˜ ะธ แƒ’แƒ-แƒฉแƒ˜/แƒฉแƒ˜. แƒฉแƒ•แƒ”แƒœ แƒ•แƒ˜แƒกแƒฌแƒแƒ•แƒšแƒ˜แƒ— แƒแƒ› แƒฃแƒ™แƒแƒœแƒแƒกแƒ™แƒœแƒ”แƒšแƒ—แƒแƒœ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒแƒก - แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜ แƒœแƒแƒฉแƒ•แƒ”แƒœแƒ”แƒ‘แƒ˜แƒ แƒฅแƒ•แƒ”แƒ›แƒแƒ—.

แƒ›แƒแƒชแƒ”แƒ›แƒฃแƒšแƒ˜แƒ แƒคแƒแƒ˜แƒšแƒ˜ api/v1/api.go, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒจแƒ”แƒ˜แƒชแƒแƒ•แƒก แƒ›แƒแƒ แƒจแƒ แƒฃแƒขแƒ”แƒ‘แƒก แƒฉแƒ•แƒ”แƒœแƒ˜ API-แƒกแƒ—แƒ•แƒ˜แƒก:

/ 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())

Go-แƒก แƒ แƒ—แƒฃแƒš แƒ›แƒแƒ แƒจแƒ แƒฃแƒขแƒ”แƒ‘แƒ—แƒแƒœ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ˜แƒก แƒกแƒ˜แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ” แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒก แƒฎแƒ“แƒ˜แƒก แƒ’แƒแƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ“แƒ”แƒก แƒ“แƒ˜แƒ“แƒ˜, แƒ แƒ—แƒฃแƒšแƒ˜ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒ˜แƒ แƒ”แƒ‘แƒ แƒ“แƒ แƒจแƒ”แƒœแƒแƒ แƒฉแƒฃแƒœแƒ”แƒ‘แƒ.

แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ แƒจแƒฃแƒแƒšแƒ”แƒ“แƒฃแƒ แƒ—แƒแƒœ

แƒ“แƒแƒ“แƒ’แƒ›แƒ แƒ’แƒฃแƒšแƒ˜แƒกแƒฎแƒ›แƒแƒ‘แƒก แƒ”แƒ แƒ—แƒ˜ 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 แƒกแƒขแƒแƒœแƒ“แƒแƒ แƒขแƒฃแƒšแƒ˜ แƒ‘แƒ˜แƒ‘แƒšแƒ˜แƒแƒ—แƒ”แƒ™แƒ แƒ›แƒแƒ˜แƒชแƒแƒ•แƒก แƒกแƒขแƒแƒขแƒ˜แƒ™แƒฃแƒ  แƒ™แƒแƒœแƒขแƒ”แƒœแƒขแƒ—แƒแƒœ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒšแƒแƒ‘แƒ”แƒ‘แƒก, แƒ›แƒแƒ— แƒจแƒแƒ แƒ˜แƒก แƒกแƒฃแƒ แƒแƒ—แƒ”แƒ‘แƒก, JavaScript แƒ“แƒ 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.

แƒกแƒฌแƒแƒ แƒ˜ แƒ’แƒแƒ›แƒแƒ แƒ—แƒ•แƒ

Go-แƒก แƒแƒกแƒ”แƒ•แƒ” แƒแƒฅแƒ•แƒก แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ, แƒกแƒแƒฎแƒ”แƒšแƒฌแƒแƒ“แƒ”แƒ‘แƒ˜แƒ— 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

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ