最近在学习golang想自己跟着教程做项目,看到geektutu的教程非常nice,就跟着学习一下。geektutu学习项目地址d
由于之前有了解golang的语法,所以代码还是能够看懂。
main.go
package main
import (
"fmt"
"log"
"net/http"
)
func main() {
http.HandleFunc("/",indexHandler)
http.HandleFunc("/hello",helloHandler)
log.Fatal(http.ListenAndServe(":9999",nil))
}
func indexHandler(w http.ResponseWriter, req *http.Request) {
fmt.Fprintf(w,"URL.Path = %q\n",req.URL.Path)
}
func helloHandler(w http.ResponseWriter,req *http.Request) {
for k, v := range req.Header {
fmt.Fprintf(w,"Header[%q] = %q\n",k ,v)
}
}
main.go
package main
import (
"fmt"
"log"
"net/http"
)
type Engine struct {}
func (engine *Engine) ServeHTTP(w http.ResponseWriter, req *http.Request) {
switch req.URL.Path {
case "/":
fmt.Fprintf(w,"URL.Path = %q \n",req.URL.Path)
case "/hello":
for k ,v := range req.Header {
fmt.Fprintf(w, "Header[%q] = %q \n",k,v)
}
default:
fmt.Fprintf(w,"404 NOT FOUND: %s \n", req.URL)
}
}
func main() {
engine := new (Engine)
log.Fatal(http.ListenAndServe(":9999",engine))
}
main.go
package main
import (
"fmt"
"net/http"
"gee"
)
func main() {
r := gee.New()
r.GET("/",func(w http.ResponseWriter, req * http.Request){
fmt.Fprintf(w,"URL.Path = %q \n", req.URL.Path)
})
r.GET("/hello",func(w http.ResponseWriter, req * http.Request){
for k,v := range req.Header {
fmt.Fprintf(w,"Headler[%q] = %q \n", k,v)
}
})
r.Run(":9999")
}
gee.go
package gee
import (
"fmt"
"net/http"
)
type HandlerFunc func(http.ResponseWriter, *http.Request)
type Engine struct {
router map[string]HandlerFunc
}
func New() *Engine {
return &Engine{router: make(map[string]HandlerFunc)}
}
func (engine *Engine) addRoute(method string,pattern string,headler HandlerFunc){
key := method + "-" + pattern
engine.router[key] = headler
}
func (engine *Engine) GET(pattern string, handler HandlerFunc) {
engine.addRoute("GET", pattern, handler)
}
func (engine *Engine) POST(pattern string, handler HandlerFunc) {
engine.addRoute("POST", pattern, handler)
}
func (engine *Engine) Run(addr string) (err error) {
return http.ListenAndServe(addr, engine)
}
func (engine *Engine) ServeHTTP(w http.ResponseWriter, req *http.Request) {
key := req.Method + "-" + req.URL.Path
if handler, ok := engine.router[key]; ok {
handler(w, req)
} else {
fmt.Fprintf(w, "404 NOT FOUND: %s\n", req.URL)
}
}
在gee.go文件中以Engine结构体为基础实现了addRoute、GET、POST、Run、ServeHTTP的接口。
在Engine中,添加了一张路由映射表route,key 由请求方法和静态路由地址构成,GET和POST会将映射关系添加到map中 。ServeHTTP调用时去map中查找相应的关系,没有找到则返回404。