Golang 作为谷歌推出的一门后端语言,一出生就万众瞩目,笔者作为一个在互联网行业沉沉(就没浮起来过????)的前端小菜鸡当然难逃它的魅力,于是便积极地投身到学习 Go 语言的浪潮中去了,可是摸摸索索的学了好久,始终不得其门,犹如王野道长的师叔们看风后气门秘诀一般,一看就晕,一看就忘,所以总想着要找一个切入点去上手练习它,忽然有一天,一个奇怪的想法窜入脑门,“为啥不让 Go 变得更 ‘前端’ 一点呢?”,于是 duang~ duang~ duang~,有了它:

gono

下面开始正文介绍这个小家伙吧。

学习一门新语言,很多人的习惯都是启动一个 Web 服务作为开始,那么看看 Go 如何启动一个 Web 服务吧!

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 怎样快速启动一个服务吧!

package main

import (
	"gono"
	_ "./routes"
)

// var conf = structs.InitParams{
// 	Proxy: false,
// }

func main()  {
	gn := gono.Init()
	gn.Listen(9000)
}
复制代码

神奇的是,现在 9000 端口已经启动了你想要的服务啦~而且!请注意这句

_ "./routes"

笔者的目录结构如下:

在 test.go 中就可以把抽离出来的路由模块全部导入进去了,在自己的路由模块的 init 中将函数注入进去就可以将路由导入给 gono 啦

路由逻辑部分

GET 请求的拦截

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 请求的拦截

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 请求:
  1. POST 请求:

嘿嘿,总的来说,纸上得来终觉浅,绝知此事要躬行~ 大家也可以尝试尝试呀

PS: 来自贫困山区的孩子 Emine 从来没有得到过 star 的关怀,希望大家顺手给个 star 吧,????