Web服务器的底层原理,在前面的linux C编程中已经涉及到。
Go语言直接封装了相应的实现,所以可以很容易的起一个Web服务器。
package main
import (
"io"
"log"
"net/http"
)
func sayHello(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, "Hello world, this is version 1")
}
func main() {
// 设置路由
http.HandleFunc("/", sayHello)
err := http.ListenAndServe(":8080", nil)
if err != nil {
log.Fatal(err)
}
}
这里隐藏一个默认的控制器
package main
import (
"io"
"log"
"net/http"
)
type myHandler struct{}
func (*myHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, "URL: "+r.URL.String())
}
func sayHello(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, "Hello world, this is version 2")
}
func main() {
mux := http.NewServeMux()
mux.Handle("/", &myHandler{})
mux.HandleFunc("/hello", sayHello)
err := http.ListenAndServe(":8080", mux)
if err != nil {
log.Fatal(err)
}
}
最底层的封装
package main
import (
"io"
"log"
"net/http"
"time"
)
type myHandler struct{}
func (*myHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, "URL: "+r.URL.String())
if h, ok := mux[r.URL.String()]; ok {
h(w, r)
return
}
}
func sayHello(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, "Hello world, this is version 3")
}
func sayBye(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, "Bye Bye, this is version 3")
}
var mux map[string]func(http.ResponseWriter, *http.Request)
func main() {
server := http.Server{
Addr: ":8080",
Handler: &myHandler{},
ReadTimeout: 5 * time.Second,
}
mux = make(map[string]func(http.ResponseWriter, *http.Request))
mux["/hello"] = sayHello
mux["/bye"] = sayBye
err := server.ListenAndServe()
if err != nil {
log.Fatal(err)
}
}