從零開始寫GO-API框架 一 [重復(fù)造輪子 - Golang]

先嘚啵幾句

大家好,Golang這么棒的語言學(xué)習(xí)的人越來越多,github上的輪子也是逐漸多起來,但很多剛學(xué)的朋友沒有深入理解輪子的原理,看輪子使用手冊(cè)直接就用,每個(gè)人輪子的規(guī)則策略基本都有自己的特性,我們不能每次都跟重新學(xué)本書一樣,人腦有限是學(xué)不過來的

俗話說:『知其然知其所以然』。為了不讓每個(gè)輪子都重新學(xué)一遍,最好的辦法把輪子的核心思想掌握,這樣拿過來一個(gè)同樣屬性的輪子,你就能從上層一眼看透整體輪子的架構(gòu),稍微學(xué)學(xué)就知道好處和痛點(diǎn)在什么地方。

不管API框架輪子有多少,但核心思想基本一致,就拿php/java/go,他們?nèi)叩膚eb框架核心思想也大致相同,不相信可以去嘗試找3個(gè)框架讀一讀,讀完你不會(huì)失望的

我個(gè)人本身是一位phper,雖說語言只是工具,但職場(chǎng)上需要我們掌握更多的工具才能發(fā)揮自己的潛能,于是我就開始各種吸收go相關(guān)知識(shí),看書、看源碼、碎片時(shí)間讀簡書。最后為了檢驗(yàn)自己的學(xué)習(xí)成果動(dòng)手寫了一套簡易版的API框架,一切的學(xué)習(xí)只有動(dòng)手的時(shí)候才知道自己知多少。

嘚啵玩,準(zhǔn)備進(jìn)入正題

構(gòu)思

簡版框架為了掌握核心思想,我們先列出來想要這個(gè)框架實(shí)現(xiàn)的特性

  1. 支持靜態(tài)路由、參數(shù)路由、組路由
  2. 組件式可擴(kuò)展的 JSON/TEXT/JSONP/XML等輸出格式
  3. 支持依賴注入
  4. 支持中間件編寫
  5. 統(tǒng)一日志管理
  6. HTTP上下文處理
  7. 內(nèi)置一些可擴(kuò)展的標(biāo)準(zhǔn)化組件

差不多這些,這套簡易框架為了路由操作速度快,把gin框架的節(jié)點(diǎn)tree拿過來直接使用,這樣可以讓我們更快的搭建核心的功能(除了tree.go),其余代碼簡易全部手寫,只有這樣才能明白golang的真正吸引力

干貨,整就完了哈

源碼介紹

package main

import (
    "koala/v1"
)


func main() {
    // 實(shí)例koala
    app := koala.New()

    // ** ctx *koala.Context 這里是重點(diǎn)
    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)
    })

    // 運(yùn)行http server 端口 :8080
    app.Run(":8080")
}

1、主函數(shù)main中實(shí)例化 koala.New()

zhangliang@zhangliang:~***koala$ go run test.go
[KOALA-DEBUG][啟動(dòng)中]
Add GET /member/:id 
[KOALA-DEBUG]監(jiān)聽端口[:8080]
[KOALA-DEBUG][服務(wù)啟動(dòng)成功]

2、當(dāng)請(qǐng)求 http://127.0.0.1:8080/member/10

3、HTTP返回


{
    name: "xiaoliang",
    age: 32
}

API框架重點(diǎn)在上下文處理

app.Add("GET", "/member/:name/:age", func(ctx *koala.Context) {

重點(diǎn)在HTTP上下文處理上,為了使用者更簡易的操作,不需要知道核心如何實(shí)現(xiàn),所有操作均可在Context中拿到(ctx *koala.Context)

API框架上下文結(jié)構(gòu)體說明

// 上下文
type Context struct {
    rw http.ResponseWriter
    req *http.Request
    koala *Koala
    routerName string
    method string
    Param Params
}

rw http.ResponseWriter:

  1. http處理程序使用ResponseWriter接口
  2. 接口包含: Header、Writer、WriterHeader

req *http.Request:

  1. 接收到一個(gè)http請(qǐng)求后,解析相應(yīng)的報(bào)文信息,均會(huì)解析為http.Request結(jié)構(gòu)體字段,例如:Method、URL、Header、Body、Host、Form等相關(guān)結(jié)構(gòu)體字段

koala *Koala:

  1. 框架核心引擎,結(jié)構(gòu)體我這里貼出來

// 定義 koala引擎結(jié)構(gòu)
type Koala struct {
    // 調(diào)試模式
    debug bool

    // 版本號(hào)
    version string

    // 節(jié)點(diǎn)樹
    trees map[string]*node

    // 臨時(shí)對(duì)象池
    pool sync.Pool

    // 單例注入
    di DIer

}

method string

請(qǐng)求方式,例如: get/post/delete/connect/put等

Param Params

繼承一些獲取參數(shù)相關(guān)函數(shù)

曉亮 - 期待您的關(guān)注

我也是golang初學(xué)者,寫這篇文章也是為了給自己學(xué)習(xí)過程做個(gè)記錄,能讓寫過的每一行代碼理解的更深。

我的學(xué)習(xí)過程也是看很多開源代碼結(jié)合而來,開源精神需要(貢獻(xiàn)、付出),我從其他大牛代碼吸取很多知識(shí),也希望通過自己的理解將知識(shí)轉(zhuǎn)化成通俗易懂的語言把這份知識(shí)貢獻(xiàn)正在看這篇文章的您。

Koala API框架目前狀態(tài)是文章和開發(fā)同步進(jìn)行,估計(jì)會(huì)有很多問題,希望您對(duì)新手文章能給予體諒,也麻煩您狠狠的指出缺點(diǎn)BUG等,您的鞭策就是學(xué)習(xí)動(dòng)力,萬分感謝。

關(guān)注我吧,您不會(huì)失望,后面會(huì)陸續(xù)更新,保證您看完所有文章能寫一套自己的輪子,同樣能看懂別人的輪子。

下一遍將從kola引擎結(jié)構(gòu)講起,您真正想看的馬上開始。 曉亮期待您的關(guān)注

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容