αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž‚αŸαž αž‘αŸ†αž–αŸαžšαž“αŸ…αž€αŸ’αž“αž»αž„ Golang - αž–αžΈαžŸαžΆαž˜αž‰αŸ’αž‰αž‘αŸ…αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰

αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž‚αŸαž αž‘αŸ†αž–αŸαžšαž“αŸ…αž€αŸ’αž“αž»αž„ Golang - αž–αžΈαžŸαžΆαž˜αž‰αŸ’αž‰αž‘αŸ…αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰

αž€αžΆαž›αž–αžΈαž”αŸ’αžšαžΆαŸ†αž†αŸ’αž“αžΆαŸ†αž˜αž»αž“αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ αž’αž—αž·αžœαžŒαŸ’αž GophishαžœαžΆαž”αžΆαž“αž’αŸ’αžœαžΎαž±αŸ’αž™αžœαžΆαž’αžΆαž…αžšαŸ€αž“ Golang αŸ” αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžŠαžΉαž„αžαžΆ Go αž‚αžΊαž‡αžΆαž—αžΆαžŸαžΆαžŠαŸαž˜αžΆαž“αž’αžΆαž“αž»αž—αžΆαž– αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ†αž–αŸαž‰αž”αž“αŸ’αžαŸ‚αž˜αžŠαŸ„αž™αž”αžŽαŸ’αžŽαžΆαž›αŸαž™αž‡αžΆαž…αŸ’αžšαžΎαž“αŸ” Go αž‚αžΊαž’αžΆαž…αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž”αžΆαž“αŸ– αž‡αžΆαž–αž·αžŸαŸαžŸ αž’αŸ’αž“αž€αž’αžΆαž…αž”αž„αŸ’αž€αžΎαžαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž…αŸ†αž αŸ€αž„αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž”αžΆαž“αž™αŸ‰αžΆαž„αž„αžΆαž™αžŸαŸ’αžšαž½αž›αž‡αžΆαž˜αž½αž™αžœαžΆαŸ”

αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡αž“αž·αž™αžΆαž™αž’αŸ†αž–αžΈαž€αžΆαžšαžŸαžšαžŸαŸαžšαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž“αŸ…αž€αŸ’αž“αž»αž„ Go αŸ” αžαŸ„αŸ‡αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž‡αžΆαž˜αž½αž™αžšαžΏαž„αžŸαžΆαž˜αž‰αŸ’αž‰αŸ—αžŠαžΌαž…αž‡αžΆ "Hello world!" αž αžΎαž™αž”αž‰αŸ’αž…αž”αŸ‹αžŠαŸ„αž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαŸ‚αž›αž˜αžΆαž“αž˜αž»αžαž„αžΆαžšαž‘αžΆαŸ†αž„αž“αŸαŸ‡αŸ–

- αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ Let's Encrypt αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ HTTPS αŸ”
- αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαžšαŸ‰αŸ„αžαž‘αŸαžš API αŸ”
- αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž§αž”αž€αžšαžŽαŸαž€αžŽαŸ’αžαžΆαž›αŸ”
- αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž―αž€αžŸαžΆαžšαž‹αž·αžαž·αžœαž“αŸ’αžαŸ”
- αž€αžΆαžšαž”αž·αž‘αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαŸ”

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 in Go αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

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

αž§αž‘αžΆαž αžšαžŽαŸαž‘αžΈαž˜αž½αž™αž”αŸ’αžšαžΎαž˜αž»αžαž„αžΆαžšαž‡αŸ†αž“αž½αž™ http.HandleFunc αŸ” αžœαžΆαžšαž»αŸ†αž˜αž»αžαž„αžΆαžšαž˜αž½αž™αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαžŠαŸ‚αž›αž‘αž‘αž½αž›αž™αž€ http.ResponseWriter αž“αž·αž„ http.Request αž€αŸ’αž“αž»αž„ ServeHTTP αŸ”

αž˜αŸ’αž™αŸ‰αžΆαž„αžœαž·αž‰αž‘αŸ€αž αž’αŸ’αž“αž€αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž“αŸ…αž€αŸ’αž“αž»αž„ Golang αžαŸ’αžšαžΌαžœαž”αžΆαž“αžαŸ†αžŽαžΆαž„αžŠαŸ„αž™αž…αŸ†αžŽαž»αž…αž”αŸ’αžšαž‘αžΆαž€αŸ‹αžαŸ‚αž˜αž½αž™ αžŠαŸ‚αž›αž•αŸ’αžαž›αŸ‹αž±αž€αžΆαžŸαž…αŸ’αžšαžΎαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αžŸαžšαžŸαŸαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡ αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸ αž§αž”αž€αžšαžŽαŸαž€αžŽαŸ’αžαžΆαž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαžŠαŸ„αž™αž”αŸ’αžšαžΎαž§αž”αž€αžšαžŽαŸαžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™ αžŠαŸ‚αž› ServeHTTP αžŠαŸ†αž”αžΌαž„αž’αŸ’αžœαžΎαž’αŸ’αžœαžΈαž˜αž½αž™ αž αžΎαž™αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž αŸ…αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžš ServeHTTP αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαŸ”

αžŠαžΌαž…αžŠαŸ‚αž›αž”αžΆαž“αžšαŸ€αž”αžšαžΆαž”αŸ‹αžαžΆαž„αž›αžΎ αž’αŸ’αž“αž€αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž”αž„αŸ’αž€αžΎαžαž€αžΆαžšαž†αŸ’αž›αžΎαž™αžαž”αž‘αŸ…αž“αžΉαž„αžŸαŸ†αžŽαžΎαŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžαžΎαž§αž”αž€αžšαžŽαŸαžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž˜αž½αž™αžŽαžΆαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αŸ’αžšαžΎαž“αŸ…αž–αŸαž›αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž˜αž½αž™?

αžŸαŸ’αž“αžΎαžšαž•αŸ’αž›αžΌαžœ

αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαž€αžΆαžšαž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœ αžŸαžΌαž˜αž”αŸ’αžšαžΎ HTTP multiplexer αŸ” αž“αŸ…αž€αŸ’αž“αž»αž„αž”αžŽαŸ’αžŽαžΆαž›αŸαž™αž˜αž½αž™αž…αŸ†αž“αž½αž“αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαž αŸ…αžαžΆ muxer ឬ Router αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž–αž½αž€αžœαžΆαžŠαžΌαž…αž‚αŸ’αž“αžΆαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αŸ” αž˜αž»αžαž„αžΆαžšαžšαž”αžŸαŸ‹ multiplexer αž‚αžΊαžŠαžΎαž˜αŸ’αž”αžΈαžœαž·αž—αžΆαž‚αž•αŸ’αž›αžΌαžœαžŸαŸ’αž“αžΎαžŸαž»αŸ† αž αžΎαž™αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸ handler αžŠαŸ‚αž›αžŸαž˜αžŸαŸ’αžšαž”αŸ”

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž€αžΆαžšαž€αžΆαžšαž‚αžΆαŸ†αž‘αŸ’αžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž•αŸ’αž›αžΌαžœαžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰ αž“αŸ„αŸ‡αžœαžΆαž‡αžΆαž€αžΆαžšαž”αŸ’αžšαžŸαžΎαžšαž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž”αžŽαŸ’αžŽαžΆαž›αŸαž™αž—αžΆαž‚αžΈαž‘αžΈαž”αžΈαŸ” αž˜αž½αž™αž€αŸ’αž“αž»αž„αž…αŸ†αžŽαŸ„αž˜αž€αž˜αŸ’αžšαž·αžαžαŸ’αž–αžŸαŸ‹αž”αŸ†αž•αž»αžαŸ” αž αŸ’αž‚αŸ„αžšαžΈαž‘αžΆ/មូស ΠΈ go-chi/chiαž”αžŽαŸ’αžŽαžΆαž›αŸαž™αž‘αžΆαŸ†αž„αž“αŸαŸ‡αž’αŸ’αžœαžΎαž±αŸ’αž™αžœαžΆαž’αžΆαž…αž’αž“αž»αžœαžαŸ’αžαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αž˜αŸ’αžšαž·αžαž˜αž’αŸ’αž™αž˜αžŠαŸ„αž™αž˜αž·αž“αž˜αžΆαž“αž”αž‰αŸ’αž αžΆαž’αŸ’αžœαžΈαž‘αžΎαž™αŸ” αžŠαŸ„αž™αž˜αžΆαž“αž‡αŸ†αž“αž½αž™αžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸ αž’αŸ’αž“αž€αž’αžΆαž…αžšαŸ€αž”αž…αŸ†αž€αžΆαžšαž”αž‰αŸ’αž‡αžΌαž“αžŸαž‰αŸ’αž‰αžΆαž‡αŸ†αž“αž½αžŸ αž“αž·αž„αž’αž“αž»αžœαžαŸ’αžαž€αžΆαžšαž„αžΆαžšαž˜αž½αž™αž…αŸ†αž“αž½αž“αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαŸ” αž’αžαŸ’αžαž”αŸ’αžšαž™αŸ„αž‡αž“αŸαžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸαž‚αžΊαž—αžΆαž–αž†αž”αž‚αŸ’αž“αžΆαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž§αž”αž€αžšαžŽαŸαžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™ HTTP αžŸαŸ’αžαž„αŸ‹αžŠαžΆαžšαŸ” αž‡αžΆαž›αž‘αŸ’αž’αž•αž› αž’αŸ’αž“αž€αž’αžΆαž…αžŸαžšαžŸαŸαžšαž€αžΌαžŠαžŸαžΆαž˜αž‰αŸ’αž‰αžŠαŸ‚αž›αž’αžΆαž…αž€αŸ‚αž”αŸ’αžšαŸ‚αž”αžΆαž“αž“αŸ…αž–αŸαž›αž’αž“αžΆαž‚αžαŸ”

αž€αžΆαžšαž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž€αŸ’αžšαž”αžαŸαžŽαŸ’αžŒαžŸαŸ’αž˜αž»αž‚αŸ’αžšαžŸαŸ’αž˜αžΆαž‰αž€αŸ’αž“αž»αž„αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž’αž˜αŸ’αž˜αžαžΆαž“αžΉαž„αžαž˜αŸ’αžšαžΌαžœαž±αŸ’αž™αž˜αžΆαž“αžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžŠαŸ‚αž›αž˜αž·αž“αž˜αžΆαž“αž›αž€αŸ’αžαžŽαŸˆαžŸαŸ’αžαž„αŸ‹αžŠαžΆαžš αž αžΎαž™αž“αŸαŸ‡αž’αŸ’αžœαžΎαž±αŸ’αž™αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αž™αŸ‰αžΆαž„αžαŸ’αž›αžΆαŸ†αž„αžŠαž›αŸ‹αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž§αž”αž€αžšαžŽαŸαžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜αŸ” αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž“αŸƒαž”αžŽαŸ’αžŽαžΆαž›αŸαž™αž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜ αž“αž·αž„αžšαŸ‰αŸ„αžαž‘αŸαžšαžŸαžΆαž˜αž‰αŸ’αž‰αž“αžΉαž„αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαžαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž—αžΆαž‚αž…αŸ’αžšαžΎαž“αŸ”

αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαŸ†αžŽαž½αžš

αž›αžΎαžŸαž–αžΈαž“αŸαŸ‡ αž™αžΎαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαž’αžΆαžαž»αž•αŸ’αžŸαŸ†αžŠαŸ‚αž›αž“αžΉαž„ "αžŸαŸ’αžαžΆαž”αŸ‹" αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αž…αžΌαž› αž“αž·αž„αž”αž‰αŸ’αž‡αžΌαž“αž”αž“αŸ’αžαžŸαŸ†αžŽαžΎαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž‘αŸ…αž€αžΆαž“αŸ‹αž’αŸ’αž“αž€αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαŸ” http.Server αž’αžΆαž…αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž™αŸ‰αžΆαž„αž„αžΆαž™αžŸαŸ’αžšαž½αž›αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αž·αž…αŸ’αž…αž€αžΆαžšαž“αŸαŸ‡αŸ”

αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž“αŸαŸ‡αž”αž„αŸ’αž αžΆαž‰αžαžΆαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž‘αž‘αž½αž›αžαž»αžŸαžαŸ’αžšαžΌαžœαž…αŸ†αž–αŸ„αŸ‡αž€αž·αž…αŸ’αž…αž€αžΆαžšαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŠαŸ‚αž›αž‘αžΆαž€αŸ‹αž‘αž„αž“αžΉαž„αž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αŸ” αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸ αž“αŸαŸ‡αž‚αžΊαž’αŸ’αžœαžΎαž€αžΆαžšαž›αžΎαž–αž·αž’αžΈαž€αžΆαžš TLSαŸ” αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ HTTP αžŸαŸ’αžαž„αŸ‹αžŠαžΆαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαžŠαžΎαž˜αŸ’αž”αžΈαž’αž“αž»αžœαžαŸ’αžαž€αžΆαžšαž αŸ… http.ListenAndServer αŸ”

αž₯αž‘αžΌαžœαž“αŸαŸ‡αžŸαžΌαž˜αž€αŸ’αžšαž‘αŸαž€αž˜αžΎαž›αž§αž‘αžΆαž αžšαžŽαŸαžŠαŸαžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ€αžαŸ”

αž€αžΆαžšαž”αž“αŸ’αžαŸ‚αž˜ 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 instance αžšαž”αžŸαŸ‹αž™αžΎαž„ (αžšαž αžΌαžαž˜αž€αžŠαž›αŸ‹αž–αŸαž›αž“αŸαŸ‡ αž™αžΎαž„αž”αžΆαž“αž”αŸ’αžšαžΎαžœαžΆαžαžΆαž˜αž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜) αž αžΎαž™αž”αž“αŸ’αžαŸ‚αž˜αž’αŸ’αž“αž€αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž‘αŸ…αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ 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/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 handler αž˜αž½αž™αž‡αžΆαž˜αž½αž™αž§αž”αž€αžšαžŽαŸαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎ αžŠαŸ‚αž›αž’αŸ’αžœαžΎαž±αŸ’αž™αžœαžΆαž’αžΆαž…αž’αž“αž»αžœαžαŸ’αžαž€αžΆαžšαž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹ αž€αžΆαžšαž”αž„αŸ’αž αžΆαž”αŸ‹ αž€αžΆαžšαž€αžαŸ‹αžαŸ’αžšαžΆ αž“αž·αž„αž˜αž»αžαž„αžΆαžšαž˜αž½αž™αž…αŸ†αž“αž½αž“αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž”αžΆαž“αž™αŸ‰αžΆαž„αž†αžΆαž”αŸ‹αžšαž αŸαžŸαŸ”

αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸ αž…αžΌαžšαž™αžΎαž„αž–αž·αž…αžΆαžšαžŽαžΆαž›αžΎαž…αŸ†αžŽαž»αž…αž”αŸ’αžšαž‘αžΆαž€αŸ‹ 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)
    })
}

αž˜αžΆαž“αžšαŸ‰αŸ„αžαž‘αŸαžšαž—αžΆαž‚αžΈαž‘αžΈαž”αžΈαžŠαžΌαž…αž‡αžΆ αž‡αžΈ αžŠαŸ‚αž›αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž–αž„αŸ’αžšαžΈαž€αž˜αž»αžαž„αžΆαžšαž“αŸƒαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αž˜αŸ’αžšαž·αžαž˜αž’αŸ’αž™αž˜αŸ”

αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž―αž€αžŸαžΆαžšαž‹αž·αžαž·αžœαž“αŸ’αž

αž”αžŽαŸ’αžŽαžΆαž›αŸαž™αžŸαŸ’αžαž„αŸ‹αžŠαžΆαžšαžšαž”αžŸαŸ‹ 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

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹