前端程序员用前端的习惯对 Golang 进行的一次小小封装尝试

Luooojunnn · · 3347 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

Golang 作为谷歌推出的一门后端语言,一出生就万众瞩目,笔者作为一个在互联网行业沉沉(就没浮起来过????)的前端小菜鸡当然难逃它的魅力,于是便积极地投身到学习 Go 语言的浪潮中去了,可是摸摸索索的学了好久,始终不得其门,犹如王野道长的师叔们看风后气门秘诀一般,一看就晕,一看就忘,所以总想着要找一个切入点去上手练习它,忽然有一天,一个奇怪的想法窜入脑门,“为啥不让 Go 变得更 ‘前端’ 一点呢?”,于是 duang~ duang~ duang~,有了它: ## gono [github](https://github.com/Luooojunnn/gono) 下面开始正文介绍这个小家伙吧。 学习一门新语言,很多人的习惯都是启动一个 Web 服务作为开始,那么看看 Go 如何启动一个 Web 服务吧! ```golang package main import ( "io" "log" "net/http" ) func main() { // Hello world, the web server helloHandler := func(w http.ResponseWriter, req *http.Request) { io.WriteString(w, "Hello, world!\n") } http.HandleFunc("/hello", helloHandler) log.Fatal(http.ListenAndServe(":8080", nil)) } ``` NO,NO,NO 这样的书写方式对前端来说很别扭,它就像是原生的 Node 一样,有一点点繁琐...,看看 gono 怎样快速启动一个服务吧! ```golang package main import ( "gono" _ "./routes" ) // var conf = structs.InitParams{ // Proxy: false, // } func main() { gn := gono.Init() gn.Listen(9000) } ``` 神奇的是,现在 9000 端口已经启动了你想要的服务啦~而且!请注意这句 *_ "./routes"* 笔者的目录结构如下: ![](https://user-gold-cdn.xitu.io/2020/1/8/16f85178fc5f83e0?w=370&h=97&f=png&s=3885) 在 test.go 中就可以把抽离出来的路由模块全部导入进去了,在自己的路由模块的 init 中将函数注入进去就可以将路由导入给 gono 啦 ### 路由逻辑部分 **GET 请求的拦截** ```golang package routes import ( "gono/router" "gono/utils" "fmt" ) // 模拟路由拆分 // get 方法 func init(){ router.G("/").Then(func(ctx *utils.Ctx) { ctx.Body = 112233 query := ctx.Query for key, val := range query { fmt.Println("key: " + key + ", value: ", val) } }).Then(func(ctx *utils.Ctx) { fmt.Println("你好,世界") }).Then(func(ctx *utils.Ctx) { fmt.Println("hello, world") }) } ``` **POST 请求的拦截** ```golang package routes import ( "gono/utils" "gono/router" "fmt" ) // 模拟路由拆分 func init() { PostUser() } // post 方法 func PostUser() { router.P("/user").Then(func(ctx *utils.Ctx) { ctx.Body = map[string]interface{} { "name": "emine", "age": 20, } query := ctx.Query for key, val := range query { fmt.Println("key: " + key + ", value: ", val) } ctx.Extra = "我是要透传给下一个 then 的信息" }).Then(func(ctx *utils.Ctx) { fmt.Println(ctx.Extra) }) } ``` 大伙儿看看!有没有一丝青春回来了的感觉!!这个 .GET/.POST,这个链式 Then 是不是像极了爱情,呸,像极了 JQ 或者是 Axios 还有 Koa 的样子!!! 目前来说 Then 里边的回调方法的入参 "ctx" 上边暴露了 - Body - 类似 koa ,返回体的内容 - Query - 请求携带的参数,在此处获取,是一个 map 结构 - Extra - 额外信息,可以通过它将信息传递给下一个 Then *请注意:使用链式的 Then ,入参函数会顺序执行,后边的 Then 会覆盖前边的赋值* 看看测试的情况吧~ 1. **GET 请求:** ![](https://user-gold-cdn.xitu.io/2020/1/9/16f883ccf0e47f26?w=749&h=473&f=png&s=26662) ![](https://user-gold-cdn.xitu.io/2020/1/9/16f883f7d5a50ac9?w=588&h=785&f=png&s=46625) 2. **POST 请求:** ![](https://user-gold-cdn.xitu.io/2020/1/9/16f8840f875c4208?w=745&h=513&f=png&s=29114) ![](https://user-gold-cdn.xitu.io/2020/1/9/16f8842f585af778?w=593&h=732&f=png&s=45234) 嘿嘿,总的来说,纸上得来终觉浅,绝知此事要躬行~ 大家也可以尝试尝试呀 **PS: 来自贫困山区的孩子 Emine 从来没有得到过 star 的关怀,希望大家顺手给个 star 吧,????** 交友地址:https://github.com/Luooojunnn/gono

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

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

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