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