เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเป€เบงเบฑเบšเปƒเบ™ Golang - เบˆเบฒเบเบ‡เปˆเบฒเบเบ”เบฒเบเป„เบ›เบซเบฒเบชเบฐเบฅเบฑเบšเบชเบฑเบšเบŠเป‰เบญเบ™

เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเป€เบงเบฑเบšเปƒเบ™ Golang - เบˆเบฒเบเบ‡เปˆเบฒเบเบ”เบฒเบเป„เบ›เบซเบฒเบชเบฐเบฅเบฑเบšเบชเบฑเบšเบŠเป‰เบญเบ™

เบซเป‰เบฒเบ›เบตเบเปˆเบญเบ™เบซเบ™เป‰เบฒเบ™เบตเป‰เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™ เบžเบฑเบ”เบ—เบฐเบ™เบฒ Gophish, เบ™เบตเป‰เบชเบฐเบซเบ™เบญเบ‡เป‚เบญเบเบฒเบ”เบ—เบตเปˆเบˆเบฐเบฎเบฝเบ™เบฎเบนเป‰ Golang เป„เบ”เป‰. เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบฎเบฑเบšเบฎเบนเป‰เบงเปˆเบฒ Go เป€เบ›เบฑเบ™เบžเบฒเบชเบฒเบ—เบตเปˆเบกเบตเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš, เบ›เบฐเบเบญเบšเบ”เป‰เบงเบเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบˆเปเบฒเบ™เบงเบ™เบซเบผเบฒเบ. Go เปเบกเปˆเบ™เบซเบผเบฒเบเบซเบผเบฒเบเบŠเบฐเบ™เบดเบ”: เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐ, เบกเบฑเบ™เบชเบฒเบกเบฒเบ”เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป€เบžเบทเปˆเบญเบžเบฑเบ”เบ—เบฐเบ™เบฒเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ‚เป‰เบฒเบ‡เป€เบŠเบตเบŸเป€เบงเบตเป‚เบ”เบเบšเปเปˆเบกเบตเบšเบฑเบ™เบซเบฒเปƒเบ”เป†.

เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เปเบกเปˆเบ™เบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบ‚เบฝเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเปƒเบ™ Go. เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ”เป‰เบงเบเบชเบดเปˆเบ‡เบ—เบตเปˆเบ‡เปˆเบฒเบเบ”เบฒเบเป€เบŠเบฑเปˆเบ™ "เบชเบฐเบšเบฒเบเบ”เบตเป‚เบฅเบ!" เปเบฅเบฐเบชเบดเป‰เบ™เบชเบธเบ”เบ”เป‰เบงเบเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ—เบตเปˆเบกเบตเบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เบ”เบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰:

- เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ Let's Encrypt เบชเปเบฒเบฅเบฑเบš HTTPS.
โ€” เป€เบฎเบฑเบ”โ€‹เบงเบฝเบโ€‹เป€เบ›เบฑเบ™ router APIโ€‹.
- เป€เบฎเบฑเบ”โ€‹เบงเบฝเบโ€‹เบฎเปˆเบงเบกโ€‹เบเบฑเบšโ€‹เป€เบ„เบทเปˆเบญเบ‡โ€‹เบกเบทโ€‹เบเบฒเบ‡โ€‹.
- เบเบฒเบ™โ€‹เบ›เบธเบ‡โ€‹เปเบ•เปˆเบ‡โ€‹เบ‚เบญเบ‡โ€‹เป„เบŸเบฅโ€‹เปŒ staticโ€‹.
- เบเบฒเบ™โ€‹เบ›เบดเบ”โ€‹เบ—เบตเปˆโ€‹เบ–เบทเบโ€‹เบ•เป‰เบญเบ‡โ€‹.

Skillbox เปเบ™เบฐเบ™เปเบฒ: เบซเบผเบฑเบเบชเบนเบ”เบžเบฒเบเบ›เบฐเบ•เบดเบšเบฑเบ” "เบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒ Python เบ•เบฑเป‰เบ‡เปเบ•เปˆเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™".

เบžเบงเบเป€เบฎเบปเบฒเป€เบ•เบทเบญเบ™: เบชเปเบฒเบฅเบฑเบšเบœเบนเป‰เบญเปˆเบฒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เบญเบ‡ "Habr" - เบชเปˆเบงเบ™เบซเบผเบธเบ” 10 rubles เป€เบกเบทเปˆเบญเบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™เปƒเบ™เบซเบผเบฑเบเบชเบนเบ” Skillbox เป‚เบ”เบเปƒเบŠเป‰เบฅเบฐเบซเบฑเบ”เบชเบปเปˆเบ‡เป€เบชเบตเบก "Habr".

เบชเบฐโ€‹เบšเบฒเบโ€‹เบ”เบตโ€‹เบŠเบฒเบงโ€‹เป‚เบฅเบ!

เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบชเป‰เบฒเบ‡เป€เบงเบฑเบšเป€เบŠเบตเบšเป€เบงเบตเปƒเบ™ 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)
}

เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบตเป‰, เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเปเบฅเบฐเป€เบ›เบตเบ”เบซเบ™เป‰เบฒ localhost, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบˆเบฐเป€เบซเบฑเบ™เบ‚เปเป‰เบ„เบงเบฒเบก "เบชเบฐเบšเบฒเบเบ”เบต, เป‚เบฅเบ!" (เบ–เป‰เบฒเบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เป€เบฎเบฑเบ”เบงเบฝเบเบขเปˆเบฒเบ‡เบ–เบทเบเบ•เป‰เบญเบ‡, เปเบ™เปˆเบ™เบญเบ™).

เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเปƒเบŠเป‰เบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™เบซเบผเบฒเบเป€เบ—เบทเปˆเบญเปƒเบ™เบžเบฒเบเบซเบผเบฑเบ‡, เปเบ•เปˆเบ—เบณเบญเบดเบ”เปƒเบซเป‰เป€เบฎเบปเบฒเป€เบ‚เบปเป‰เบฒเปƒเบˆเบงเปˆเบฒเบ—เบธเบเบขเปˆเบฒเบ‡เป€เบฎเบฑเบ”เบงเบฝเบเปเบ™เบงเปƒเบ”.

net/http

เบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบตเปˆเปƒเบŠเป‰เบŠเบธเบ” net/http, เบกเบฑเบ™เป€เบ›เบฑเบ™เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบ•เบปเป‰เบ™เบ•เปเปƒเบ™ Go เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเบ—เบฑเบ‡เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเปเบฅเบฐเบฅเบนเบเบ„เป‰เบฒ HTTP. เป€เบžเบทเปˆเบญเป€เบ‚เบปเป‰เบฒเปƒเบˆเบฅเบฐเบซเบฑเบ”, เปƒเบซเป‰เป€เบ‚เบปเป‰เบฒเปƒเบˆเบ„เบงเบฒเบกเบซเบกเบฒเบเบ‚เบญเบ‡เบชเบฒเบกเบญเบปเบ‡เบ›เบฐเบเบญเบšเบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™: http.Handler, http.ServeMux เปเบฅเบฐ http.Server.

เบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™ HTTP

เป€เบกเบทเปˆเบญเบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เป, เบœเบนเป‰เบˆเบฑเบ”เบเบฒเบ™เบˆเบฐเบงเบดเป€เบ„เบฒเบฐเบกเบฑเบ™เปเบฅเบฐเบชเป‰เบฒเบ‡เบ„เปเบฒเบ•เบญเบš. Handlers เปƒเบ™ Go เปเบกเปˆเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ”เบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰:

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

เบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เปเบฒเบญเบดเบ”เปƒเบŠเป‰เบซเบ™เป‰เบฒเบ—เบตเปˆเบœเบนเป‰เบŠเปˆเบงเบ http.HandleFunc. เบกเบฑเบ™เบซเปเปˆเบŸเบฑเบ‡เบŠเบฑเบ™เบญเบทเปˆเบ™, เป€เบŠเบดเปˆเบ‡เปƒเบŠเป‰เป€เบงเบฅเบฒ http.ResponseWriter เปเบฅเบฐ http.Request เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ ServeHTTP.

เปƒเบ™เบ„เปเบฒเบชเบฑเบšเบ•เปˆเบฒเบ‡เป†เบญเบทเปˆเบ™เป†, handlers เปƒเบ™ Golang เปเบกเปˆเบ™เบ™เปเบฒเบชเบฐเป€เบซเบ™เบตเปƒเบ™เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบ”เบฝเบง, เป€เบŠเบดเปˆเบ‡เป€เบฎเบฑเบ”เปƒเบซเป‰เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบซเบผเบฒเบเบเบฑเบš programmer. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบชเปเบฒเบฅเบฑเบšเบ•เบปเบงเบขเปˆเบฒเบ‡, เบชเบทเปˆเบเบฒเบ‡เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เป‚เบ”เบเปƒเบŠเป‰เบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™, เบšเปˆเบญเบ™เบ—เบตเปˆ ServeHTTP เบ—เปเบฒเบญเบดเบ”เป€เบฎเบฑเบ”เบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เป‚เบ—เบซเบฒเบงเบดเบ—เบตเบเบฒเบ™ ServeHTTP เบ‚เบญเบ‡เบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™เบญเบทเปˆเบ™.

เบ”เบฑเปˆเบ‡เบ—เบตเปˆเป„เบ”เป‰เบเปˆเบฒเบงเบกเบฒเบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡, เบœเบนเป‰เบˆเบฑเบ”เบเบฒเบ™เบžเบฝเบ‡เปเบ•เปˆเบชเป‰เบฒเบ‡เบเบฒเบ™เบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เบ•เปเปˆเบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เป. เปเบ•เปˆเบงเปˆเบฒเบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™เบชเบฐเป€เบžเบฒเบฐเปƒเบ”เบ—เบตเปˆเบ„เบงเบ™เบˆเบฐเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เปƒเบ™เบˆเบธเบ”เปƒเบ”เบ™เบถเปˆเบ‡เปƒเบ™เป€เบงเบฅเบฒ?

เบฎเป‰เบญเบ‡เบ‚เปเป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡

เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เปƒเบซเป‰เบเบฒเบ™เป€เบฅเบทเบญเบเบ—เบตเปˆเบ–เบทเบเบ•เป‰เบญเบ‡, เปƒเบŠเป‰ HTTP multiplexer. เปƒเบ™เบˆเปเบฒเบ™เบงเบ™เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบกเบฑเบ™เบ–เบทเบเป€เบญเบตเป‰เบ™เบงเปˆเบฒ muxer เบซเบผเบท router, เปเบ•เปˆเบžเบงเบเบกเบฑเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เปเบกเปˆเบ™เบชเบดเปˆเบ‡เบ”เบฝเบงเบเบฑเบ™. เบซเบ™เป‰เบฒเบ—เบตเปˆเบ‚เบญเบ‡ multiplexer เปเบกเปˆเบ™เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเปเบฅเบฐเป€เบฅเบทเบญเบเบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™เบ—เบตเปˆเป€เบซเบกเบฒเบฐเบชเบปเบก.

เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบเบฒเบ™เบเปเบฒเบ™เบปเบ”เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบ—เบตเปˆเบชเบฑเบšเบชเบปเบ™, เบกเบฑเบ™เบ”เบตเบเบงเปˆเบฒเบ—เบตเปˆเบˆเบฐเปƒเบŠเป‰เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบ‚เบญเบ‡เบžเบฒเบเบชเปˆเบงเบ™เบ—เบตเบชเบฒเบก. เบšเบฒเบ‡โ€‹เบชเปˆเบงเบ™โ€‹เบ—เบตเปˆโ€‹เบเป‰เบฒเบงโ€‹เบซเบ™เป‰เบฒโ€‹เบ—เบตเปˆโ€‹เบชเบธเบ” - gorilla/mux ะธ go-chi/chi, เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เป€เบฎเบฑเบ”เปƒเบซเป‰เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบ›เบธเบ‡เปเบ•เปˆเบ‡เบฅเบฐเบ”เบฑเบšเบ›เบฒเบ™เบเบฒเบ‡เป‚เบ”เบเบšเปเปˆเบกเบตเบšเบฑเบ™เบซเบฒเปƒเบ”เป†. เบ”เป‰เบงเบเบเบฒเบ™เบŠเปˆเบงเบเป€เบซเบผเบทเบญเบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒ, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบเบฒเบ™เบเปเบฒเบ™เบปเบ”เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡ wildcard เปเบฅเบฐเบ›เบฐเบ•เบดเบšเบฑเบ”เบงเบฝเบเบ‡เบฒเบ™เบญเบทเปˆเบ™เป†เบˆเปเบฒเบ™เบงเบ™เบซเบ™เบถเปˆเบ‡. เบ›เบฐเป‚เบซเบเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒเปเบกเปˆเบ™เบ„เบงเบฒเบกเป€เบ‚เบปเป‰เบฒเบเบฑเบ™เป„เบ”เป‰เบเบฑเบšเบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™ HTTP เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ‚เบฝเบ™เบฅเบฐเบซเบฑเบ”เบ‡เปˆเบฒเบเป†เบ—เบตเปˆเบชเบฒเบกเบฒเบ”เบ”เบฑเบ”เปเบ›เบ‡เป„เบ”เป‰เปƒเบ™เบญเบฐเบ™เบฒเบ„เบปเบ”.

เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเป‚เบ„เบ‡เบฎเปˆเบฒเบ‡เบเบฒเบ™เบ—เบตเปˆเบชเบฑเบšเบชเบปเบ™เปƒเบ™เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ›เบปเบเบเบฐเบ•เบดเบˆเบฐเบฎเบฝเบเบฎเป‰เบญเบ‡เปƒเบซเป‰เบกเบตเบเบฒเบ™เปเบเป‰เป„เบ‚เบ—เบตเปˆเบšเปเปˆเปเบกเปˆเบ™เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™, เปเบฅเบฐเบ™เบตเป‰เป€เบฎเบฑเบ”เปƒเบซเป‰เบ„เบงเบฒเบกเบชเบฑเบšเบชเบปเบ™เบซเบผเบฒเบเปƒเบ™เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™เปƒเบ™เบ•เบญเบ™เบ•เบปเป‰เบ™. เป€เบžเบทเปˆเบญเบชเป‰เบฒเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบชเปˆเบงเบ™เปƒเบซเบเปˆ, เบเบฒเบ™เบ›เบฐเบชเบปเบกเบ›เบฐเบชเบฒเบ™เบ‚เบญเบ‡เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เปเบฅเบฐ router เปเบšเบšเบ‡เปˆเบฒเบเบ”เบฒเบเบˆเบฐเบžเบฝเบ‡เบžเป.

เบเบฒเบ™เบ›เบฐเบกเบงเบ™เบœเบปเบ™เปเบšเบšเบชเบญเบšเบ–เบฒเบก

เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ—เบตเปˆเบˆเบฐ "เบŸเบฑเบ‡" เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ‚เบฒเป€เบ‚เบปเป‰เบฒเปเบฅเบฐเบ›เปˆเบฝเบ™เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบ—เบฑเบ‡เบซเบกเบปเบ”เป„เบ›เบซเบฒเบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™เบ—เบตเปˆเบ–เบทเบเบ•เป‰เบญเบ‡. http.Server เบชเบฒเบกเบฒเบ”เบˆเบฑเบ”เบเบฒเบ™เบเบฑเบšเบงเบฝเบเบ‡เบฒเบ™เบ™เบตเป‰เป„เบ”เป‰เบขเปˆเบฒเบ‡เบ‡เปˆเบฒเบเบ”เบฒเบ.

เบ•เปเปˆเป„เบ›เบ™เบตเป‰เบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบงเปˆเบฒเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบกเบตเบ„เบงเบฒเบกเบฎเบฑเบšเบœเบดเบ”เบŠเบญเบšเบ•เปเปˆเบซเบ™เป‰เบฒเบงเบฝเบเบ—เบฑเบ‡เบซเบกเบปเบ”เบ—เบตเปˆเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบเบฑเบšเบเบฒเบ™เบ›เบธเบ‡เปเบ•เปˆเบ‡เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ. เบ•เบปเบงเบขเปˆเบฒเบ‡เบ™เบตเป‰, เป€เบฎเบฑเบ”เบงเบฝเบเป‚เบ”เบเปƒเบŠเป‰เป‚เบ›เป‚เบ•เบ„เบญเบ™ TLS. เป€เบžเบทเปˆเบญเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เป‚เบ— http.ListenAndServer, เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ HTTP เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰.

เบ•เบญเบ™เบ™เบตเป‰เปƒเบซเป‰เป€เบšเบดเปˆเบ‡เบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบตเปˆเบชเบฑเบšเบชเบปเบ™เบซเบผเบฒเบ.

เป€เบžเบตเปˆเบกเปƒเบซเป‰เป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”

เป‚เบ”เบเบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™, เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเปเบฅเปˆเบ™เบœเปˆเบฒเบ™เป‚เบ›เบฃเป‚เบ•เบ„เป HTTP, เปเบ•เปˆเปเบ™เบฐเบ™เบณเปƒเบซเป‰เปƒเบŠเป‰เป‚เบ›เบฃเป‚เบ•เบ„เป HTTPS. เบ™เบตเป‰เบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เป„เบ”เป‰เป‚เบ”เบเบšเปเปˆเบกเบตเบšเบฑเบ™เบซเบฒเปƒเบ™ Go. เบ–เป‰เบฒเบ—เปˆเบฒเบ™เป„เบ”เป‰เบฎเบฑเบšเปƒเบšเบขเบฑเป‰เบ‡เบขเบทเบ™เปเบฅเบฐเบฅเบฐเบซเบฑเบ”เบชเปˆเบงเบ™เบ•เบปเบง, เบกเบฑเบ™เบžเบฝเบ‡เบžเปเบ—เบตเปˆเบˆเบฐเบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™ ListenAndServeTLS เบ”เป‰เบงเบเปƒเบšเบขเบฑเป‰เบ‡เบขเบทเบ™เบ—เบตเปˆเบ–เบทเบเบ•เป‰เบญเบ‡เปเบฅเบฐเป„เบŸเบฅเปŒเบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™.

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

เป€เบˆเบปเป‰เบฒเบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เป„เบ”เป‰เบ”เบตเบเบงเปˆเบฒเบ™เบตเป‰เบชเบฐเป€เปเบต.

Let's Encrypt เปƒเบซเป‰เปƒเบšเบฎเบฑเบšเบฎเบญเบ‡เบŸเบฃเบตเบ”เป‰เบงเบเบเบฒเบ™เบ•เปเปˆเบญเบฒเบเบธเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”. เป€เบžเบทเปˆเบญเปƒเบŠเป‰เบšเปเบฅเบดเบเบฒเบ™, เบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เบŠเบธเบ” 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 เบขเปˆเบฒเบ‡เป€เบ•เบฑเบกเบ—เบตเปˆเบ”เป‰เบงเบเบเบฒเบ™เบ•เปเปˆเบญเบฒเบเบธเปƒเบšเบขเบฑเป‰เบ‡เบขเบทเบ™เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”.

เป€เบžเบตเปˆเบกเป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบ—เบตเปˆเบเปเบฒเบซเบ™เบปเบ”เป€เบญเบ‡

router เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ—เบตเปˆเบฅเบงเบกเบขเบนเปˆเปƒเบ™เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™เปเบกเปˆเบ™เบ”เบต, เปเบ•เปˆเบงเปˆเบฒเบกเบฑเบ™เปเบกเปˆเบ™เบžเบทเป‰เบ™เบ–เบฒเบ™เบซเบผเบฒเบ. เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบชเปˆเบงเบ™เปƒเบซเบเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบเบฒเบ™เบเบณเบ™เบปเบ”เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบ—เบตเปˆเบŠเบฑเบšเบŠเป‰เบญเบ™เบเบงเปˆเบฒ, เบฅเบงเบกเบ—เบฑเบ‡เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบ—เบตเปˆเบŠเป‰เบญเบ™เบเบฑเบ™ เปเบฅเบฐ เบชเบฑเบ™เบเบฒเบฅเบฑเบเปเบ—เบ™, เบซเบผเบทเบ‚เบฑเป‰เบ™เบ•เบญเบ™เบเบฒเบ™เบเบณเบ™เบปเบ”เบฎเบนเบšเปเบšเบšเป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡ เปเบฅเบฐเบžเบฒเบฅเบฒเบกเบดเป€เบ•เบต.

เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰เบกเบฑเบ™เป€เบ›เบฑเบ™เบกเบนเบ™เบ„เปˆเบฒเบ—เบตเปˆเบˆเบฐเปƒเบŠเป‰เปเบžเบฑเบเป€เบเบฑเบ” gorilla/mux ะธ go-chi/chi. เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบฎเบฝเบ™เบฎเบนเป‰เบงเบดเบ—เบตเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบญเบฑเบ™เบชเบธเบ”เบ—เป‰เบฒเบ - เบ•เบปเบงเบขเปˆเบฒเบ‡เปเบกเปˆเบ™เบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰.

เปƒเบซเป‰เปเบกเปˆเบ™เป„เบŸเบฅเปŒ 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 เบชเปเบฒเบฅเบฑเบšเป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เปƒเบ™เป„เบŸเบฅเปŒเบ•เบปเป‰เบ™เบ•เป.

เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ” mount เบ™เบตเป‰เบเบฑเบš router เบ•เบปเป‰เบ™เบ•เปเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบžเบฒเบเปƒเบ•เป‰ api / v1 / prefix เบเบฑเบšเบ„เบทเบ™เป„เบ›เบšเปˆเบญเบ™เปƒเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ•เบปเป‰เบ™เบ•เปเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ:

// 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 เบเบฑเบšเป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบ—เบตเปˆเบชเบฑเบšเบชเบปเบ™เป€เบฎเบฑเบ”เปƒเบซเป‰เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเป€เบฎเบฑเบ”เปƒเบซเป‰เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เปเบฅเบฐเบšเปเบฒเบฅเบธเบ‡เบฎเบฑเบเบชเบฒเบ‚เบญเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆ, เบชเบฐเบฅเบฑเบšเบชเบฑเบšเบŠเป‰เบญเบ™.

เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบ•เบปเบงเบเบฒเบ‡

Staging เบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบเบฑเบšเบเบฒเบ™เบซเปเปˆเบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™ 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)
    })
}

เบกเบต router เบ‚เบญเบ‡เบžเบฒเบเบชเปˆเบงเบ™เบ—เบตเบชเบฒเบก, เป€เบŠเบฑเปˆเบ™: 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(). เป€เบŠเบตเบšเป€เบงเบตเปเบกเปˆเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เปƒเบ™ goroutine, เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบŠเปˆเบญเบ‡เบˆเบฐเบ–เบทเบเบŸเบฑเบ‡เป€เบžเบทเปˆเบญเบฎเบฑเบšเบชเบฑเบ™เบเบฒเบ™เบฅเบปเบšเบเบงเบ™. เบ—เบฑเบ™เบ—เบตเบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเบชเบฑเบ™เบเบฒเบ™, เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ›เบดเบ”, เปเบ•เปˆเบšเปเปˆเปเบกเปˆเบ™เบ—เบฑเบ™เบ—เบต, เปเบ•เปˆเบซเบผเบฑเบ‡เบˆเบฒเบเบชเบญเบ‡เบชเบฒเบกเบงเบดเบ™เบฒเบ—เบต.

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

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™