go 简单路由实现

一、golang 路由实现的简单思路

1、http启动后,请求路径时走统一的入口函数
1、通过统一函数入口,获取request 的url路径
2、通过对url的路径分析,确定具体执行什么函数

二、统一入口函数

package main

import (
	"io"
	"net/http"
)

// 统一请求入口函数
func index(w http.ResponseWriter,r *http.Request){
	io.WriteString(w,"hello")
}

func main(){
        // 启动8083 端口
	http.ListenAndServe(":8083",http.HandlerFunc(index))   // 无论路由如何去写,都会进入到 index 函数中
}

三、解析 url 调用不同的函数

package main

import (
	"io"
	"net/http"
)

func index(w http.ResponseWriter,r *http.Request){
	io.WriteString(w,"index")
}

func list(w http.ResponseWriter,r *http.Request){
	io.WriteString(w,"index")
}


// 解析url 函数
func router(w http.ResponseWriter,r *http.Request){
	if r.RequestURI == "/"{
		index(w,r)
	} else if r.RequestURI == "/list"  {
		list(w,r)
	}
}

func main(){
	http.ListenAndServe(":8083",http.HandlerFunc(router))
}

四、稍微高大上一点的router 实现

package main

import (
	"net/http"
)

var m *router

func init() {
	m = &router{}
	m.r = make(map[string]func(http.ResponseWriter, *http.Request))
}

type router struct {
	r map[string]func(http.ResponseWriter, *http.Request)
}

func (this *router) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	for k, fun := range this.r {
		if k == r.RequestURI {
			fun(w, r)
			return
		}
	}
	w.Write([]byte("404"))
}

func (this *router) AddRouter(pattern string, handlerFunc func(http.ResponseWriter, *http.Request)) {
	this.r[pattern] = handlerFunc
}

func updateOne(w http.ResponseWriter, r *http.Request) {
	w.Write([]byte("hello"))
}

func update(w http.ResponseWriter, r *http.Request) {
	w.Write([]byte("hello2"))
}

func main() {
	m.AddRouter("/update_one", updateOne)
	m.AddRouter("/update", update)

	http.ListenAndServe(":8888", m)  // 一单访问了域名便会 访问 m 的 ServeHTTP 方法

}

如果喜欢看小说,请到183小说网

posted @ 2019-05-08 15:20  xiaobaiskill  阅读(2668)  评论(0编辑  收藏  举报