一、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小说网

最新文章

  1. 节省Json流量
  2. asp.net 重定向的三种方法
  3. sqlce中不支持sp_rename修改表名
  4. Spark中的RDD操作简介
  5. vs2012如何创建报表
  6. SVN Git 设置忽略目录 大全
  7. python进阶6 HTTP协议客户端实现
  8. iOS WebView的用法
  9. 浅析SQL Server数据库中的伪列以及伪列的含义
  10. C# 后台构造json数据
  11. SpringBoot从零单排 ------初级入门篇
  12. 单列模式,装饰器、new方法、类/静态方法实现单列模式
  13. JSP学习记录
  14. 运行vs时打开一个浏览器窗口,而不是在原有窗口上打开一个标签
  15. 理解 Redis(8) - Ordered set 值
  16. 通俗易懂详解Java代理及代码实战
  17. mybatis的select、insert、update、delete语句
  18. 全面兼容的Iframe 与父页面交互操作
  19. XML解析的二种方法之dom解析
  20. 关于编译openjdk过程的一个编码错误

热门文章

  1. 洛谷 1071 潜伏者(NOIp2009提高组)
  2. 洛谷 1091 合唱队形(NOIp2004提高组)
  3. JUnit 深入
  4. 【Codeforces 479D】Long Jumps
  5. Set Map List Iterator
  6. Android NumberProgressBar:动态移动显示百分比进度的进度条
  7. HDU 1159 LCS最长公共子序列
  8. 兼容IE8 addEventListener、removeEventListener 函数
  9. Codeforces 303A(构造)
  10. Ubuntu 16.04设置文件夹试图永久以列表显示