เจ—เฉ‹เจฒเฉฐเจ— เจตเจฟเฉฑเจš เจตเฉˆเฉฑเจฌ เจธเจฐเจตเจฐ เจตเจฟเจ•เจพเจธ - เจธเจงเจพเจฐเจจ เจคเฉ‹เจ‚ เจ—เฉเฉฐเจเจฒเจฆเจพเจฐ เจคเฉฑเจ•

เจ—เฉ‹เจฒเฉฐเจ— เจตเจฟเฉฑเจš เจตเฉˆเฉฑเจฌ เจธเจฐเจตเจฐ เจตเจฟเจ•เจพเจธ - เจธเจงเจพเจฐเจจ เจคเฉ‹เจ‚ เจ—เฉเฉฐเจเจฒเจฆเจพเจฐ เจคเฉฑเจ•

เจชเฉฐเจœ เจธเจพเจฒ เจชเจนเจฟเจฒเจพเจ‚ เจฎเฉˆเจ‚ เจธเจผเฉเจฐเฉ‚ เจ•เฉ€เจคเจพ เจธเฉ€ เจ—เฉ‹เจซเจฟเจธเจผ เจตเจฟเจ•เจธเจฟเจค เจ•เจฐเฉ‹, เจ‡เจธ เจจเจพเจฒ เจ—เฉ‹เจฒเฉฐเจ— เจธเจฟเฉฑเจ–เจฃ เจฆเจพ เจฎเฉŒเจ•เจพ เจฎเจฟเจฒเจฟเจ†เฅค เจฎเฉˆเจจเฉ‚เฉฐ เจ…เจนเจฟเจธเจพเจธ เจนเฉ‹เจ‡เจ† เจ•เจฟ เจ—เฉ‹ เจ‡เฉฑเจ• เจธเจผเจ•เจคเฉ€เจธเจผเจพเจฒเฉ€ เจญเจพเจธเจผเจพ เจนเฉˆ, เจœเฉ‹ เจฌเจนเฉเจค เจธเจพเจฐเฉ€เจ†เจ‚ เจฒเจพเจ‡เจฌเฉเจฐเฉ‡เจฐเฉ€เจ†เจ‚ เจฆเฉเจ†เจฐเจพ เจชเฉ‚เจฐเจ• เจนเฉˆเฅค เจ—เฉ‹ เจฌเจนเฉเจฎเฉเจ–เฉ€ เจนเฉˆ: เจ–เจพเจธ เจคเฉŒเจฐ 'เจคเฉ‡, เจ‡เจธเจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจฌเจฟเจจเจพเจ‚ เจ•เจฟเจธเฉ‡ เจธเจฎเฉฑเจธเจฟเจ† เจฆเฉ‡ เจธเจฐเจตเจฐ-เจธเจพเจˆเจก เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจตเจฟเจ•เจธเจค เจ•เจฐเจจ เจฒเจˆ เจ•เฉ€เจคเฉ€ เจœเจพ เจธเจ•เจฆเฉ€ เจนเฉˆเฅค

เจ‡เจน เจฒเฉ‡เจ– เจ—เฉ‹ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจธเจฐเจตเจฐ เจฒเจฟเจ–เจฃ เจฌเจพเจฐเฉ‡ เจนเฉˆเฅค เจ†เจ‰ "เจนเฉˆเจฒเฉ‹ เจตเจฐเจฒเจก" เจตเจฐเจ—เฉ€เจ†เจ‚ เจธเจงเจพเจฐเจจ เจšเฉ€เจœเจผเจพเจ‚ เจจเจพเจฒ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเฉ€เจ เจ…เจคเฉ‡ เจนเฉ‡เจ  เจฒเจฟเจ–เฉ€เจ†เจ‚ เจธเจฎเจฐเฉฑเจฅเจพเจตเจพเจ‚ เจตเจพเจฒเฉ€ เจ‡เฉฑเจ• เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจจเจพเจฒ เจธเจฎเจพเจชเจค เจ•เจฐเฉ€เจ:

- HTTPS เจฒเจˆ เจšเจฒเฉ‹ เจเจจเจ•เฉเจฐเจฟเจชเจŸ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจเจพเฅค
โ€” API เจฐเจพเจŠเจŸเจฐ เจตเจœเฉ‹เจ‚ เจ•เฉฐเจฎ เจ•เจฐเจจเจพเฅค
- เจฎเจฟเจกเจฒเจตเฉ‡เจ…เจฐ เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจจเจพเฅค
- เจธเจฅเจฟเจฐ เจซเจพเจˆเจฒเจพเจ‚ เจฆเฉ€ เจชเฉเจฐเฉ‹เจธเฉˆเจธเจฟเฉฐเจ—.
- เจธเจนเฉ€ เจฌเฉฐเจฆ.

เจธเจ•เจฟเฉฑเจฒเจฌเจพเจ•เจธ เจธเจฟเจซเจผเจพเจฐเจฟเจธเจผ เจ•เจฐเจฆเจพ เจนเฉˆ: เจชเฉเจฐเฉˆเจ•เจŸเฉ€เจ•เจฒ เจ•เฉ‹เจฐเจธ "เจธเจ•เฉเจฐเฉˆเจš เจคเฉ‹เจ‚ เจชเจพเจˆเจฅเจจ เจกเจฟเจตเฉˆเจฒเจชเจฐ".

เจ…เจธเฉ€เจ‚ เจฏเจพเจฆ เจฆเจฟเจตเจพเจ‰เจ‚เจฆเฉ‡ เจนเจพเจ‚: "Habr" เจฆเฉ‡ เจธเจพเจฐเฉ‡ เจชเจพเจ เจ•เจพเจ‚ เจฒเจˆ - "Habr" เจชเฉเจฐเจšเจพเจฐ เจ•เฉ‹เจก เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจ•เจฟเจธเฉ‡ เจตเฉ€ เจธเจ•เจฟเฉฑเจฒเจฌเจพเจ•เจธ เจ•เฉ‹เจฐเจธ เจตเจฟเฉฑเจš เจฆเจพเจ–เจฒเจพ เจฒเฉˆเจฃ เจตเฉ‡เจฒเฉ‡ 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)
}

เจ‡เจธ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจœเฉ‡เจ•เจฐ เจคเฉเจธเฉ€เจ‚ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจจเฉ‚เฉฐ เจฐเจจ เจ•เจฐเจฆเฉ‡ เจนเฉ‹ เจ…เจคเฉ‡ เจชเฉ‡เจœ เจจเฉ‚เฉฐ เจ“เจชเจจ เจ•เจฐเจฆเฉ‡ เจนเฉ‹ เจฒเฉ‹เจ•เจฒเจนเฉ‹เจธเจŸ, เจซเจฟเจฐ เจคเฉเจธเฉ€เจ‚ เจคเฉเจฐเฉฐเจค "เจนเฉˆเจฒเฉ‹, เจตเจฐเจฒเจก!" เจŸเฉˆเจ•เจธเจŸ เจตเฉ‡เจ–เฉ‹เจ—เฉ‡. (เจœเฉ‡เจ•เจฐ เจธเจญ เจ•เฉเจ เจธเจนเฉ€ เจขเฉฐเจ— เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆ, เจฌเฉ‡เจธเจผเจ•).

เจ…เจธเฉ€เจ‚ เจฌเจพเจ…เจฆ เจตเจฟเฉฑเจš เจ•เจˆ เจตเจพเจฐ เจนเฉˆเจ‚เจกเจฒเจฐ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจพเจ‚เจ—เฉ‡, เจชเจฐ เจชเจนเจฟเจฒเจพเจ‚ เจ‡เจน เจธเจฎเจเฉ€เจ เจ•เจฟ เจธเจญ เจ•เฉเจ เจ•เจฟเจตเฉ‡เจ‚ เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆเฅค

net/http

เจ‰เจฆเจพเจนเจฐเจจ เจชเฉˆเจ•เฉ‡เจœ เจจเฉ‚เฉฐ เจตเจฐเจคเจฟเจ† net/http, เจ‡เจน เจธเจฐเจตเจฐเจพเจ‚ เจ…เจคเฉ‡ HTTP เจ•เจฒเจพเจ‡เฉฐเจŸเจธ เจฆเฉ‹เจตเจพเจ‚ เจจเฉ‚เฉฐ เจตเจฟเจ•เจธเจค เจ•เจฐเจจ เจฒเจˆ เจ—เฉ‹ เจตเจฟเฉฑเจš เจชเฉเจฐเจพเจ‡เจฎเจฐเฉ€ เจŸเฉ‚เจฒ เจนเฉˆเฅค เจ•เฉ‹เจก เจจเฉ‚เฉฐ เจธเจฎเจเจฃ เจฒเจˆ, เจ†เจ“ เจคเจฟเฉฐเจจ เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจจ เจคเฉฑเจคเจพเจ‚ เจฆเฉ‡ เจ…เจฐเจฅ เจธเจฎเจเฉ€เจ: http.Handler, http.ServeMux เจ…เจคเฉ‡ http.Serverเฅค

HTTP เจนเฉˆเจ‚เจกเจฒเจฐ

เจœเจฆเฉ‹เจ‚ เจธเจพเจจเฉ‚เฉฐ เจ•เฉ‹เจˆ เจฌเฉ‡เจจเจคเฉ€ เจฎเจฟเจฒเจฆเฉ€ เจนเฉˆ, เจคเจพเจ‚ เจนเฉˆเจ‚เจกเจฒเจฐ เจ‡เจธเจฆเจพ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจ•เจฐเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจœเจตเจพเจฌ เจคเจฟเจ†เจฐ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจ—เฉ‹ เจตเจฟเฉฑเจš เจนเฉˆเจ‚เจกเจฒเจฐ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจฒเจพเจ—เฉ‚ เจ•เฉ€เจคเฉ‡ เจ—เจ เจนเจจ:

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

เจชเจนเจฟเจฒเฉ€ เจ‰เจฆเจพเจนเจฐเจจ http.HandleFunc เจธเจนเจพเจ‡เจ• เจซเฉฐเจ•เจธเจผเจจ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ€ เจนเฉˆเฅค เจ‡เจน เจ‡เฉฑเจ• เจนเฉ‹เจฐ เจซเฉฐเจ•เจธเจผเจจ เจจเฉ‚เฉฐ เจธเจฎเฉ‡เจŸเจฆเจพ เจนเฉˆ, เจœเฉ‹ เจฌเจฆเจฒเฉ‡ เจตเจฟเฉฑเจš http.ResponseWriter เจ…เจคเฉ‡ http.Request เจจเฉ‚เฉฐ ServeHTTP เจตเจฟเฉฑเจš เจฒเฉˆเจ‚เจฆเจพ เจนเฉˆเฅค

เจฆเฉ‚เจœเฉ‡ เจธเจผเจฌเจฆเจพเจ‚ เจตเจฟเฉฑเจš, เจ—เฉ‹เจฒเฉฐเจ— เจตเจฟเฉฑเจš เจนเฉˆเจ‚เจกเจฒเจฐ เจ‡เฉฑเจ• เจธเจฟเฉฐเจ—เจฒ เจ‡เฉฐเจŸเจฐเจซเฉ‡เจธ เจตเจฟเฉฑเจš เจชเฉ‡เจธเจผ เจ•เฉ€เจคเฉ‡ เจœเจพเจ‚เจฆเฉ‡ เจนเจจ, เจœเฉ‹ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจฐ เจจเฉ‚เฉฐ เจฌเจนเฉเจค เจธเจพเจฐเฉ‡ เจตเจฟเจ•เจฒเจช เจฆเจฟเฉฐเจฆเจพ เจนเฉˆเฅค เจ‡เจธ เจฒเจˆ, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจฎเจฟเจกเจฒเจตเฉ‡เจ…เจฐ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจนเฉˆเจ‚เจกเจฒเจฐ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจฒเจพเจ—เฉ‚ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ, เจœเจฟเฉฑเจฅเฉ‡ ServeHTTP เจชเจนเจฟเจฒเจพเจ‚ เจ•เฉเจ เจ•เจฐเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจซเจฟเจฐ เจ•เจฟเจธเฉ‡ เจนเฉ‹เจฐ เจนเฉˆเจ‚เจกเจฒเจฐ เจฆเฉ€ ServeHTTP เจตเจฟเจงเฉ€ เจจเฉ‚เฉฐ เจ•เจพเจฒ เจ•เจฐเจฆเจพ เจนเฉˆเฅค

เจœเจฟเจตเฉ‡เจ‚ เจ‰เฉฑเจชเจฐ เจฆเฉฑเจธเจฟเจ† เจ—เจฟเจ† เจนเฉˆ, เจนเฉˆเจ‚เจกเจฒเจฐ เจธเจฟเจฐเจซเจผ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจฆเฉ‡ เจœเจตเจพเจฌ เจคเจฟเจ†เจฐ เจ•เจฐเจฆเฉ‡ เจนเจจเฅค เจชเจฐ เจธเจฎเฉ‡เจ‚ เจฆเฉ‡ เจ•เจฟเจธเฉ‡ เจ–เจพเจธ เจฌเจฟเฉฐเจฆเฉ‚ 'เจคเฉ‡ เจ•เจฟเจนเฉœเจพ เจ–เจพเจธ เจนเฉˆเจ‚เจกเจฒเจฐ เจตเจฐเจคเจฟเจ† เจœเจพเจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ?

เจฐเฉ‚เจŸเจฟเฉฐเจ— เจฆเฉ€ เจฌเฉ‡เจจเจคเฉ€ เจ•เจฐเฉ‹

เจธเจนเฉ€ เจšเฉ‹เจฃ เจ•เจฐเจจ เจฒเจˆ, เจ‡เฉฑเจ• HTTP เจฎเจฒเจŸเฉ€เจชเจฒเฉˆเจ•เจธเจฐ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเฉ‹เฅค เจฌเจนเฉเจค เจธเจพเจฐเฉ€เจ†เจ‚ เจฒเจพเจ‡เจฌเฉเจฐเฉ‡เจฐเฉ€เจ†เจ‚ เจตเจฟเฉฑเจš เจ‡เจธเจจเฉ‚เฉฐ เจฎเฉเจ•เจธเจฐ เจœเจพเจ‚ เจฐเจพเจŠเจŸเจฐ เจ•เจฟเจนเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ, เจชเจฐ เจ‡เจน เจธเจญ เจ‡เฉฑเจ•เฉ‹ เจœเจฟเจนเฉ€เจ†เจ‚ เจนเจจเฅค เจฎเจฒเจŸเฉ€เจชเจฒเฉˆเจ•เจธเจฐ เจฆเจพ เจ•เฉฐเจฎ เจฌเฉ‡เจจเจคเฉ€ เจฎเจพเจฐเจ— เจฆเจพ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจ•เจฐเจจเจพ เจ…เจคเฉ‡ เจ‰เจšเจฟเจค เจนเฉˆเจ‚เจกเจฒเจฐ เจฆเฉ€ เจšเฉ‹เจฃ เจ•เจฐเจจเจพ เจนเฉˆเฅค

เจœเฉ‡ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ—เฉเฉฐเจเจฒเจฆเจพเจฐ เจฐเฉ‚เจŸเจฟเฉฐเจ— เจฒเจˆ เจธเจนเจพเจ‡เจคเจพ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ, เจคเจพเจ‚ เจคเฉ€เจœเฉ€-เจงเจฟเจฐ เจฆเฉ€เจ†เจ‚ เจฒเจพเจ‡เจฌเฉเจฐเฉ‡เจฐเฉ€เจ†เจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจเจพ เจฌเจฟเจนเจคเจฐ เจนเฉˆ. เจ•เฉเจ เจธเจญ เจคเฉ‹เจ‚ เจ‰เฉฑเจจเจค - gorilla/mux ะธ เจ—เฉ‹-เจšเฉ€/เจšเฉ€, เจ‡เจน เจฒเจพเจ‡เจฌเฉเจฐเฉ‡เจฐเฉ€เจ†เจ‚ เจฌเจฟเจจเจพเจ‚ เจ•เจฟเจธเฉ‡ เจธเจฎเฉฑเจธเจฟเจ† เจฆเฉ‡ เจ‡เฉฐเจŸเจฐเจฎเฉ€เจกเฉ€เจเจŸ เจชเฉเจฐเฉ‹เจธเฉˆเจธเจฟเฉฐเจ— เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจเจพ เจธเฉฐเจญเจต เจฌเจฃเจพเจ‰เจ‚เจฆเฉ€เจ†เจ‚ เจนเจจเฅค เจ‰เจนเจจเจพเจ‚ เจฆเฉ€ เจฎเจฆเจฆ เจจเจพเจฒ, เจคเฉเจธเฉ€เจ‚ เจตเจพเจˆเจฒเจกเจ•เจพเจฐเจก เจฐเฉ‚เจŸเจฟเฉฐเจ— เจจเฉ‚เฉฐ เจ•เฉŒเจ‚เจซเจฟเจ—เจฐ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจ…เจคเฉ‡ เจ•เจˆ เจนเฉ‹เจฐ เจ•เฉฐเจฎ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค เจ‰เจนเจจเจพเจ‚ เจฆเจพ เจซเจพเจ‡เจฆเจพ เจฎเจฟเจ†เจฐเฉ€ HTTP เจนเฉˆเจ‚เจกเจฒเจฐเจพเจ‚ เจจเจพเจฒ เจ…เจจเฉเจ•เฉ‚เจฒเจคเจพ เจนเฉˆ. เจจเจคเฉ€เจœเฉ‡ เจตเจœเฉ‹เจ‚, เจคเฉเจธเฉ€เจ‚ เจธเจงเจพเจฐเจจ เจ•เฉ‹เจก เจฒเจฟเจ– เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจœเฉ‹ เจญเจตเจฟเฉฑเจ– เจตเจฟเฉฑเจš เจธเฉ‹เจงเจฟเจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆเฅค

เจ‡เฉฑเจ• เจ†เจฎ เจธเจฅเจฟเจคเฉ€ เจตเจฟเฉฑเจš เจ—เฉเฉฐเจเจฒเจฆเจพเจฐ เจซเจฐเฉ‡เจฎเจตเจฐเจ• เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจจ เจฒเจˆ เจ—เฉˆเจฐ-เจฎเจฟเจ†เจฐเฉ€ เจนเฉฑเจฒเจพเจ‚ เจฆเฉ€ เจฒเฉ‹เฉœ เจชเจตเฉ‡เจ—เฉ€, เจ…เจคเฉ‡ เจ‡เจน เจกเจฟเจซเฉŒเจฒเจŸ เจนเฉˆเจ‚เจกเจฒเจฐ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจจเฉ‚เฉฐ เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจฃ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจ—เฉเฉฐเจเจฒเจฆเจพเจฐ เจฌเจฃเจพเจ‰เจ‚เจฆเจพ เจนเฉˆเฅค เจœเจผเจฟเจ†เจฆเจพเจคเจฐ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ, เจกเจฟเจซเฉŒเจฒเจŸ เจฒเจพเจ‡เจฌเฉเจฐเฉ‡เจฐเฉ€ เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจธเจงเจพเจฐเจจ เจฐเจพเจŠเจŸเจฐ เจฆเจพ เจธเฉเจฎเฉ‡เจฒ เจ•เจพเจซเฉ€ เจนเฉ‹เจตเฉ‡เจ—เจพเฅค

เจชเฉเฉฑเจ›เจ—เจฟเฉฑเจ› เจฆเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ†

เจ‡เจธ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ, เจธเจพเจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจ…เจœเจฟเจนเฉ‡ เจนเจฟเฉฑเจธเฉ‡ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ เจœเฉ‹ เจ†เจ‰เจฃ เจตเจพเจฒเฉ‡ เจ•เจจเฉˆเจ•เจธเจผเจจเจพเจ‚ เจฒเจˆ "เจธเฉเจฃเฉ‡เจ—เจพ" เจ…เจคเฉ‡ เจธเจพเจฐเฉ€เจ†เจ‚ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจธเจนเฉ€ เจนเฉˆเจ‚เจกเจฒเจฐ เจจเฉ‚เฉฐ เจฐเฉ€เจกเจพเจ‡เจฐเฉˆเจ•เจŸ เจ•เจฐเฉ‡เจ—เจพเฅค http.Server เจ‡เจธ เจ•เฉฐเจฎ เจจเฉ‚เฉฐ เจ†เจธเจพเจจเฉ€ เจจเจพเจฒ เจธเฉฐเจญเจพเจฒ เจธเจ•เจฆเจพ เจนเฉˆเฅค

เจนเฉ‡เจ เจพเจ‚ เจฆเจฟเจ–เจพเจ‰เจ‚เจฆเจพ เจนเฉˆ เจ•เจฟ เจธเจฐเจตเจฐ เจ‰เจนเจจเจพเจ‚ เจธเจพเจฐเฉ‡ เจ•เฉฐเจฎเจพเจ‚ เจฒเจˆ เจœเจฟเฉฐเจฎเฉ‡เจตเจพเจฐ เจนเฉˆ เจœเฉ‹ เจ•เฉเจจเฉˆเจ•เจธเจผเจจ เจชเฉเจฐเฉ‹เจธเฉˆเจธเจฟเฉฐเจ— เจจเจพเจฒ เจธเจฌเฉฐเจงเจค เจนเจจเฅค เจ‡เจน, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, TLS เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆเฅค http.ListenAndServer เจ•เจพเจฒ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฒเจˆ, เจ‡เฉฑเจ• เจฎเจฟเจ†เจฐเฉ€ HTTP เจธเจฐเจตเจฐ เจตเจฐเจคเจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค

เจนเฉเจฃ เจ†เจ‰ เจนเฉ‹เจฐ เจ—เฉเฉฐเจเจฒเจฆเจพเจฐ เจ‰เจฆเจพเจนเจฐเจฃเจพเจ‚ เจจเฉ‚เฉฐ เจตเฉ‡เจ–เฉ€เจ.

เจ†เจ“ เจ‡เจจเจ•เฉเจฐเจฟเจชเจŸ เจจเฉ‚เฉฐ เจœเฉ‹เฉœเจจเจพ

เจฎเฉ‚เจฒ เจฐเฉ‚เจช เจตเจฟเฉฑเจš, เจธเจพเจกเฉ€ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ HTTP เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ 'เจคเฉ‡ เจšเฉฑเจฒเจฆเฉ€ เจนเฉˆ, เจชเจฐ HTTPS เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจ เจฆเฉ€ เจธเจฟเจซเจพเจฐเจธเจผ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆเฅค เจ‡เจน Go เจตเจฟเฉฑเจš เจธเจฎเฉฑเจธเจฟเจ†เจตเจพเจ‚ เจคเฉ‹เจ‚ เจฌเจฟเจจเจพเจ‚ เจ•เฉ€เจคเจพ เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆเฅค เจœเฉ‡เจ•เจฐ เจคเฉเจธเฉ€เจ‚ เจ‡เฉฑเจ• เจธเจฐเจŸเฉ€เจซเจฟเจ•เฉ‡เจŸ เจ…เจคเฉ‡ เจชเฉเจฐเจพเจˆเจตเฉ‡เจŸ เจ•เฉเฉฐเจœเฉ€ เจชเฉเจฐเจพเจชเจค เจ•เฉ€เจคเฉ€ เจนเฉˆ, เจคเจพเจ‚ เจ‡เจน ListenAndServeTLS เจจเฉ‚เฉฐ เจธเจนเฉ€ เจธเจฐเจŸเฉ€เจซเจฟเจ•เฉ‡เจŸ เจ…เจคเฉ‡ เจฎเฉเฉฑเจ– เจซเจพเจˆเจฒเจพเจ‚ เจจเจพเจฒ เจฐเจœเจฟเจธเจŸเจฐ เจ•เจฐเจจ เจฒเจˆ เจ•เจพเจซเฉ€ เจนเฉˆเฅค

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

เจคเฉเจธเฉ€เจ‚ เจนเจฎเฉ‡เจธเจผเจพ เจฌเจฟเจนเจคเจฐ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค

เจ†เจ‰ เจ‡เฉฐเจ•เฉเจฐเจฟเจชเจŸ เจ•เจฐเฉ€เจ เจ†เจŸเฉ‹เจฎเฉˆเจŸเจฟเจ• เจจเจตเจฟเจ†เจ‰เจฃ เจฆเฉ‡ เจจเจพเจฒ เจฎเฉเจซเจค เจธเจฐเจŸเฉ€เจซเจฟเจ•เฉ‡เจŸ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจธเฉ‡เจตเจพ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจ เจฒเจˆ, เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจชเฉˆเจ•เฉ‡เจœ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ autocert.

เจ‡เจธ เจจเฉ‚เฉฐ เจ•เฉŒเจ‚เจซเจฟเจ—เจฐ เจ•เจฐเจจ เจฆเจพ เจธเจญ เจคเฉ‹เจ‚ เจ†เจธเจพเจจ เจคเจฐเฉ€เจ•เจพ 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 เจธเจฎเจฐเจฅเจจ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฆเจพ เจ‡เจน เจ‡เฉฑเจ• เจ†เจธเจพเจจ เจคเจฐเฉ€เจ•เจพ เจนเฉˆเฅค

เจ•เจธเจŸเจฎ เจฐเฉ‚เจŸ เจœเฉ‹เฉœ เจฐเจฟเจนเจพ เจนเฉˆ

เจธเจŸเฉˆเจ‚เจกเจฐเจก เจฒเจพเจ‡เจฌเฉเจฐเฉ‡เจฐเฉ€ เจตเจฟเฉฑเจš เจธเจผเจพเจฎเจฒ เจกเจฟเจซเฉŒเจฒเจŸ เจฐเจพเจŠเจŸเจฐ เจตเจงเฉ€เจ† เจนเฉˆ, เจชเจฐ เจ‡เจน เจฌเจนเฉเจค เจฌเฉเจจเจฟเจ†เจฆเฉ€ เจนเฉˆเฅค เจœเจผเจฟเจ†เจฆเจพเจคเจฐ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจตเจงเฉ‡เจฐเฉ‡ เจ—เฉเฉฐเจเจฒเจฆเจพเจฐ เจฐเฉ‚เจŸเจฟเฉฐเจ— เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆ, เจœเจฟเจธ เจตเจฟเฉฑเจš เจจเฉ‡เจธเจŸเจก เจ…เจคเฉ‡ เจตเจพเจˆเจฒเจกเจ•เจพเจฐเจก เจฐเฉ‚เจŸ เจธเจผเจพเจฎเจฒ เจนเฉเฉฐเจฆเฉ‡ เจนเจจ, เจœเจพเจ‚ เจชเจพเจฅ เจชเฉˆเจŸเจฐเจจ เจ…เจคเฉ‡ เจชเฉˆเจฐเจพเจฎเฉ€เจŸเจฐ เจธเฉˆเฉฑเจŸ เจ•เจฐเจจ เจฒเจˆ เจ‡เฉฑเจ• เจตเจฟเจงเฉ€เฅค

เจ‡เจธ เจธเจฅเจฟเจคเฉ€ เจตเจฟเฉฑเจš เจ‡เจน เจชเฉˆเจ•เฉ‡เจœเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจ เจฆเฉ‡ เจฏเฉ‹เจ— เจนเฉˆ gorilla/mux ะธ เจ—เฉ‹-เจšเฉ€/เจšเฉ€. เจ…เจธเฉ€เจ‚ เจธเจฟเจ–เจพเจ‚เจ—เฉ‡ เจ•เจฟ เจฌเจพเจ…เจฆ เจตเจพเจฒเฉ‡ เจจเจพเจฒ เจ•เจฟเจตเฉ‡เจ‚ เจ•เฉฐเจฎ เจ•เจฐเจจเจพ เจนเฉˆ - เจ‡เฉฑเจ• เจ‰เจฆเจพเจนเจฐเจจ เจนเฉ‡เจ เจพเจ‚ เจฆเจฟเฉฑเจคเฉ€ เจ—เจˆ เจนเฉˆ.

เจฆเจฟเฉฑเจคเฉ€ เจ—เจˆ เจซเจพเจˆเจฒ 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())

เจ—เฉเฉฐเจเจฒเจฆเจพเจฐ เจฐเฉ‚เจŸเจพเจ‚ เจฆเฉ‡ เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจจ เจตเจฟเฉฑเจš เจ—เฉ‹ เจฆเฉ€ เจธเฉŒเจ–, เจตเฉฑเจกเฉ‡, เจ—เฉเฉฐเจเจฒเจฆเจพเจฐ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจฆเฉ‡ เจขเจพเจ‚เจšเฉ‡ เจ…เจคเฉ‡ เจฐเฉฑเจ–-เจฐเจ–เจพเจ… เจจเฉ‚เฉฐ เจธเจฐเจฒ เจฌเจฃเจพเจ‰เจฃเจพ เจธเฉฐเจญเจต เจฌเจฃเจพเจ‰เจ‚เจฆเฉ€ เจนเฉˆเฅค

เจฎเจฟเจกเจฒเจตเฉ‡เจ…เจฐ เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจจเจพ

เจธเจŸเฉ‡เจœเจฟเฉฐเจ— เจตเจฟเฉฑเจš เจ‡เฉฑเจ• 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)
    })
}

เจ‡เฉฑเจฅเฉ‡ เจฅเจฐเจก เจชเจพเจฐเจŸเฉ€ เจฐเจพเจŠเจŸเจฐ เจนเจจ, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจšเฉ€, เจœเฉ‹ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจฎเจฟเจกเจฒเจตเฉ‡เจ…เจฐ เจ•เจพเจฐเจœเจ•เฉเจธเจผเจฒเจคเจพ เจจเฉ‚เฉฐ เจตเจงเจพเจ‰เจฃ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฐเจฆเฉ‡ เจนเจจเฅค

เจธเจฅเจฟเจฐ เจซเจพเจˆเจฒเจพเจ‚ เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจจเจพ

เจ—เฉ‹ เจธเจŸเฉˆเจ‚เจกเจฐเจก เจฒเจพเจ‡เจฌเฉเจฐเฉ‡เจฐเฉ€ เจตเจฟเฉฑเจš เจšเจฟเฉฑเจคเจฐ, 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.

เจธเจนเฉ€ เจฌเฉฐเจฆ

เจ—เฉ‹ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพ เจตเฉ€ เจนเฉˆ เจœเจฟเจธเจจเฉ‚เฉฐ 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)

เจ‡เจ• เจธเจฟเฉฑเจŸเจพ เจนเฉ‹เจฃ เจฆเฉ‡ เจจเจพเจคเฉ‡

เจ—เฉ‹ เจฒเจ—เจญเจ— เจฏเฉ‚เจจเฉ€เจตเจฐเจธเจฒ เจธเจŸเฉˆเจ‚เจกเจฐเจก เจฒเจพเจ‡เจฌเฉเจฐเฉ‡เจฐเฉ€ เจตเจพเจฒเฉ€ เจ‡เฉฑเจ• เจธเจผเจ•เจคเฉ€เจธเจผเจพเจฒเฉ€ เจญเจพเจธเจผเจพ เจนเฉˆเฅค เจ‡เจธ เจฆเฉ€เจ†เจ‚ เจกเจฟเจซเฉŒเจฒเจŸ เจธเจฎเจฐเฉฑเจฅเจพเจตเจพเจ‚ เจฌเจนเฉเจค เจšเฉŒเฉœเฉ€เจ†เจ‚ เจนเจจ, เจ…เจคเฉ‡ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ‡เฉฐเจŸเจฐเจซเฉ‡เจธ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจตเจงเจพเจ‡เจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ - เจ‡เจน เจคเฉเจนเจพเจจเฉ‚เฉฐ เจธเฉฑเจšเจฎเฉเฉฑเจš เจญเจฐเฉ‹เจธเฉ‡เจฎเฉฐเจฆ HTTP เจธเจฐเจตเจฐ เจตเจฟเจ•เจธเจฟเจค เจ•เจฐเจจ เจฆเฉ€ เจ†เจ—เจฟเจ† เจฆเจฟเฉฐเจฆเจพ เจนเฉˆเฅค

เจธเจ•เจฟเฉฑเจฒเจฌเจพเจ•เจธ เจธเจฟเจซเจผเจพเจฐเจฟเจธเจผ เจ•เจฐเจฆเจพ เจนเฉˆ:

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹