从零开始写GO-API框架 一 [重复造轮子 - Golan
先嘚啵几句
大家好,Golang这么棒的语言学习的人越来越多,github上的轮子也是逐渐多起来,但很多刚学的朋友没有深入理解轮子的原理,看轮子使用手册直接就用,每个人轮子的规则策略基本都有自己的特性,我们不能每次都跟重新学本书一样,人脑有限是学不过来的
俗话说:『知其然知其所以然』。为了不让每个轮子都重新学一遍,最好的办法把轮子的核心思想掌握,这样拿过来一个同样属性的轮子,你就能从上层一眼看透整体轮子的架构,稍微学学就知道好处和痛点在什么地方。
不管API框架轮子有多少,但核心思想基本一致,就拿php/java/go,他们三者的web框架核心思想也大致相同,不相信可以去尝试找3个框架读一读,读完你不会失望的
我个人本身是一位phper,虽说语言只是工具,但职场上需要我们掌握更多的工具才能发挥自己的潜能,于是我就开始各种吸收go相关知识,看书、看源码、碎片时间读简书。最后为了检验自己的学习成果动手写了一套简易版的API框架,一切的学习只有动手的时候才知道自己知多少。
嘚啵玩,准备进入正题
构思
简版框架为了掌握核心思想,我们先列出来想要这个框架实现的特性
- 支持静态路由、参数路由、组路由
- 组件式可扩展的 JSON/TEXT/JSONP/XML等输出格式
- 支持依赖注入
- 支持中间件编写
- 统一日志管理
- HTTP上下文处理
- 内置一些可扩展的标准化组件
差不多这些,这套简易框架为了路由操作速度快,把gin框架的节点tree拿过来直接使用,这样可以让我们更快的搭建核心的功能(除了tree.go),其余代码简易全部手写,只有这样才能明白golang的真正吸引力
干货,整就完了哈
源码介绍
package main
import (
"koala/v1"
)
func main() {
// 实例koala
app := koala.New()
// ** ctx *koala.Context 这里是重点
app.Add("GET", "/member/:name/:age", func(ctx *koala.Context) {
type ss struct {
Name string `json:"name"`
Age int `json:"age"`
}
test := ss{"xiaoliang", 32}
ctx.Json(test)
})
// 运行http server 端口 :8080
app.Run(":8080")
}
1、主函数main中实例化 koala.New()
zhangliang@zhangliang:~***koala$ go run test.go
[KOALA-DEBUG][启动中]
Add GET /member/:id
[KOALA-DEBUG]监听端口[:8080]
[KOALA-DEBUG][服务启动成功]
2、当请求 http://127.0.0.1:8080/member/10
3、HTTP返回
{
name: "xiaoliang",
age: 32
}
API框架重点在上下文处理
app.Add("GET", "/member/:name/:age", func(ctx *koala.Context) {
重点在HTTP上下文处理上,为了使用者更简易的操作,不需要知道核心如何实现,所有操作均可在Context中拿到(ctx *koala.Context)
API框架上下文结构体说明
// 上下文
type Context struct {
rw http.ResponseWriter
req *http.Request
koala *Koala
routerName string
method string
Param Params
}
rw http.ResponseWriter:
- http处理程序使用ResponseWriter接口
- 接口包含: Header、Writer、WriterHeader
req *http.Request:
- 接收到一个http请求后,解析相应的报文信息,均会解析为http.Request结构体字段,例如:Method、URL、Header、Body、Host、Form等相关结构体字段
koala *Koala:
- 框架核心引擎,结构体我这里贴出来
// 定义 koala引擎结构
type Koala struct {
// 调试模式
debug bool
// 版本号
version string
// 节点树
trees map[string]*node
// 临时对象池
pool sync.Pool
// 单例注入
di DIer
}
method string
请求方式,例如: get/post/delete/connect/put等
Param Params
继承一些获取参数相关函数
晓亮 - 期待您的关注
我也是golang初学者,写这篇文章也是为了给自己学习过程做个记录,能让写过的每一行代码理解的更深。
我的学习过程也是看很多开源代码结合而来,开源精神需要(贡献、付出),我从其他大牛代码吸取很多知识,也希望通过自己的理解将知识转化成通俗易懂的语言把这份知识贡献正在看这篇文章的您。
Koala API框架目前状态是文章和开发同步进行,估计会有很多问题,希望您对新手文章能给予体谅,也麻烦您狠狠的指出缺点BUG等,您的鞭策就是学习动力,万分感谢。
关注我吧,您不会失望,后面会陆续更新,保证您看完所有文章能写一套自己的轮子,同样能看懂别人的轮子。
下一遍将从kola引擎结构讲起,您真正想看的马上开始。 晓亮期待您的关注