Go vem com um conjunto enorme de bibliotecas padrão e mais milhares de bibliotecas criadas pela comunidade.
Por exemplo para criar um servidor http basta o seguinte:
package main
import (
"io"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, "Olá mundo HTTP!")
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":9999", nil)
}
Esse é um exemplo bem simples de como servir arquivos. Nesse caso o diretório assets contem os arquivos que queremos servir.
package main
import (
"log"
"net/http"
)
func main() {
assets := http.FileServer(http.Dir("assets/"))
http.Handle("/", assets)
log.Fatal(http.ListenAndServe(":9999", nil))
}
Esse exemplo mostra como adicionar cabeçalhos na resposta do servidor antes de entregar os arquivos. Isso é importante porque você pode manipular o cache no cliente ou mesmo modificar completamente como a requisição vai responder.
Como bonus adicionamos dois parâmetros para configurar a porta e o diretório com os assets.
package main
import (
"flag"
"log"
"net/http"
)
func setHSTSHeader(h http.Handler) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
w.Header().Add("Strict-Transport-Security", "max-age=63072000; includeSubDomains")
h.ServeHTTP(w, r)
}
}
func main() {
var port = flag.String("port", "9999", "Define what TCP port to bind to")
var root = flag.String("root", "assets/", "Define the root filesystem path")
flag.Parse()
assets := setHSTSHeader(http.FileServer(http.Dir(*root)))
http.Handle("/", assets)
log.Fatal(http.ListenAndServe(":"+*port, nil))
}
Esse ultimo exemplo fica melhor se compilarmos com:
go build http.go
E então execute com:
./http --help