关于路由

stu2162583 · · 545 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。
**自学习golang以来,无论是beego还是web.go亦或是站长大人的dreamgo的路由,感觉都不明白是怎么写的,下面我把自己的一种实现方式给写出来,希望大家指点一二。** `目录结构` ``` web controller index.go xxx router route.go util util.go view index.html main.go #入口 ``` `web入口路由handler处理` ``` func main() { http.HandleFunc("/", handler) log.Fatal(http.ListenAndServe(":8080", nil)) } func handler(w http.ResponseWriter, r *http.Request) { defer r.Body.Close() // 获取路由url地址 path := r.URL.Path sort_path := path[1:] // path的情况可能 有/ /facxx.ico /index /index.html /post/2 post提交 get提交 // 分静态资源和请求之分 switch { case sort_path != "" && sort_path != "favicon.ico": router.Control(w, r, sort_path) case sort_path == "favicon.ico": http.NotFound(w, r) return } } ``` ``` 路由映射管理 ``` ``` // 路由映射 var m = make(map[string]interface{}) // 配置对应的路由 func init() { v := new(controller.Index) m["Index"] = v } const ( DEFAULT_CTRL = "Index" // 这里要注意的是 控制器的方法在反射和定义的时候必须要大写 DEFAULT_ACTION = "Index" ) // Control // 路由核心方法 func Control(w http.ResponseWriter, r *http.Request, path string) { defer r.Body.Close() routers := routeInfo(path) // 根据地址获取对应的控制器 ctrl_struct, ok := m[routers[0]] // 找到对应的控制器 if !ok { ctrl_struct = m[DEFAULT_CTRL] } ctrl := reflect.ValueOf(ctrl_struct) action := ctrl.MethodByName(routers[1]) k := action.Kind() if k == reflect.Func { params := make([]reflect.Value, 2) params[0] = reflect.ValueOf(w) params[1] = reflect.ValueOf(r) action.Call(params) return } http.NotFound(w, r) return } func routeInfo(path string) []string { arr := strings.Split(path, "/") // 第一个参数需要是controller // 第二个参数需要是action if len(arr) == 1 { arr = append(arr, DEFAULT_ACTION) } else { arr[1] = DEFAULT_ACTION } return arr[0:2] } ``` ```Index 控制器 ``` ``` type Index struct{} func (this *Index) Index(w http.ResponseWriter, r *http.Request) { r.ParseForm() id := r.Form["id"][0] // 此处必须是值而不能是指针 result := res.Result{} result.Code = 0 result.Message = "成功" result.Data = make(map[string]interface{}) result.Data["id"] = id fmt.Println(result) encode_arr, err := json.Marshal(result) if err != nil { log.Fatal(err) return } fmt.Println(string(encode_arr)) w.Write(encode_arr) } ``` ``` 这就是我实现的路由 感觉跟网上写的不一样,请指导下 谢谢 ```

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:701969077

545 次点击  
加入收藏 微博
2 回复  |  直到 2017-10-20 04:41:34
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传