go web框架

可能根據(jù)項(xiàng)目不同可以選下面不同框架宇驾,里面具體的沒有對(duì)對(duì)比,如果想深入了解或?qū)W習(xí)可以在之后再深入猴伶,這里提供簡單的引入课舍,廢話不多少,上代碼:
1他挎、Martini
Martini框架是使用Go語言作為開發(fā)語言的一個(gè)強(qiáng)力的快速構(gòu)建模塊化web應(yīng)用與服務(wù)的開發(fā)框架筝尾。Martini是一個(gè)專門用來處理Web相關(guān)內(nèi)容的框架,其并沒有自帶有關(guān)ORM或詳細(xì)的分層內(nèi)容办桨。所以當(dāng)我們使用Martini作為我們的開發(fā)框架時(shí)筹淫,我們還需要選取適合的ORM等其他包。

package main

import (
    "github.com/astaxie/beego/context"
    "github.com/go-martini/martini"
    "github.com/martini-contrib/render"
    "net/http"
    "fmt"
)

//定義一個(gè)自己的中間件呢撞,這里將beego的context注入
func myContext() martini.Handler {
    return func(res http.ResponseWriter, req *http.Request, c martini.Context) {
        ctx := context.Context{Request: req, ResponseWriter: res}
        ctx.Input = context.NewInput(req)
        ctx.Output = context.NewOutput()
        c.Map(ctx)
    }
}

func main() {
    m := martini.Classic()
    m.Use(render.Renderer()) //注入中間件(渲染JSON和HTML模板的處理器中間件)
    m.Use(myContext())       //注入自己寫的中間件

    m.Use(func(c martini.Context) {
        fmt.Println("before a request")
        c.Next() //Next方法之后最后處理
        fmt.Println("after a request")
    })

    //普通的GET方式路由
    m.Get("/", func() string {
        return "hello world!"
    })

    //路由分組
    m.Group("/books", func(r martini.Router) {
        r.Get("/list", getBooks)
        r.Post("/add", getBooks)
        r.Delete("/delete", getBooks)
    })

    //我們以中間件的方式來注入一個(gè)Handler
    m.Use(MyHeader(m))

    m.RunOnAddr(":8080") //運(yùn)行程序監(jiān)聽端口
}

func getBooks() string {
    return "books"
}

//中間件Handler
func MyHeader(m *martini.ClassicMartini) martini.Handler {
    return func() {
        m.Group("/app", func(r martini.Router) {
            my := new(App)
            r.Get("/index", my.Index)
            r.Get("/test/:aa", my.Test)
        })
    }
}

//應(yīng)用的處理
type App struct{}

func (this *App) Index(r render.Render, ctx context.Context) {
    fmt.Println(ctx.Input.Query("action"))
    ctx.WriteString("你好世界")
}

func (this *App) Test(r render.Render, params martini.Params, req *http.Request) {
    fmt.Println(params)

    parm := make(map[string]interface{})
    if t, ok := params["aa"]; ok {
        parm["aa"] = t
    }
    req.ParseForm()
    fmt.Println(parm, req.Form)

    r.Text(200, "----")
}

參考:(1)https://github.com/go-martini/martini/blob/master/translations/README_zh_cn.md
(2)https://studygolang.com/articles/5196

2损姜、dotweb
github地址:https://github.com/devfeel/dotweb

(1)安裝
> $ go get -u github.com/devfeel/dotweb

(2) 簡單實(shí)踐:

package main
import (
    "fmt"
    "github.com/devfeel/dotweb"
)
const port = 8080
// Res struct
type Res struct {
    Result string `json:"result"`
    Data   string `json:"data"`
    Name   string `json:"name"`
}
//測(cè)試dotweb這個(gè)框架
func main() {
    app := dotweb.New() //初始化dotweb server
    app.SetLogPath("/user/local/")
    //設(shè)置路由
    InitRouter(app.HttpServer)
    err := app.StartServer(port)
    if err != nil {
        fmt.Println("dotweb startServer is err, err message is:", err)
        return
    }
    fmt.Println("成功接收")
}
//InitRouter func
func InitRouter(server *dotweb.HttpServer) {
    server.Router().GET("/push", Index)
}

//Index func
func Index(server *dotweb.HttpContext) {
    name := server.FormValue("name")
    if name == "" {
        fmt.Println("獲取name字段為nil")
        return
    }
    server.WriteJson(&Res{
        Result: "success",
        Data:   "成功",
    })
}

其他例子可以參考:https://github.com/devfeel/dotweb-example

(3)Feature

  • 支持靜態(tài)路由、參數(shù)路由殊霞、組路由
  • 路由支持文件/目錄服務(wù)摧阅,支持設(shè)置是否允許目錄瀏覽
  • HttpModule支持,支持路由之前全局級(jí)別的自定義代碼能力
  • 中間件支持绷蹲,支持App棒卷、Group、Router級(jí)別的設(shè)置 - https://github.com/devfeel/middleware
  • Feature支持祝钢,可綁定HttpServer全局啟用
  • 支持STRING/JSON/JSONP/HTML格式輸出
  • 集成Mock能力
  • 集成Timeout Hook
  • 全局HTTP錯(cuò)誤處理
  • 全局日志處理
  • 支持Hijack與websocket
  • 內(nèi)建Cache支持
  • 內(nèi)建Session支持 - 支持主備redis自動(dòng)切換
  • 內(nèi)建TLS支持
  • 支持接入第三方模板引擎(需實(shí)現(xiàn)dotweb.Renderer接口)
  • 模塊可配置
  • 自集成基礎(chǔ)統(tǒng)計(jì)數(shù)據(jù)比规,并支持按分鐘為單位的間隔時(shí)間統(tǒng)計(jì)數(shù)據(jù)輸出
    (4)配置例子
  • dotweb.conf
     <?xml version="1.0" encoding="UTF-8"?>
<config>
<app logpath="d:/gotmp/" enabledlog="true" runmode="development"/>
<server isrun="true" indexpage="index.html" port="8080" enabledgzip="false" enabledlistdir="false" enabledautohead="true" requesttimeout="30000"/>
<session enabled="true" mode="runtime" timeout="20" />
<appset>
    <set key="set1" value="1" />
    <set key="set2" value="2" />
    <set key="set3" value="3" />
    <set key="set4" value="4" />
</appset>
<middlewares>
    <middleware name="applog" isuse="true" />
</middlewares>
<routers>
    <router method="GET" path="/index" handler="Index" isuse="true">
         <middleware name="urllog" isuse="true" />
    </router>
    <router method="GET" path="/index2" handler="Index" isuse="true">
        <middleware name="urllog" isuse="true" />
    </router>
    <router method="GET" path="/index3" handler="Index" isuse="true">
            <middleware name="urllog" isuse="true" />
    </router>
    <router method="GET" path="/redirect" handler="Redirect" isuse="true"></router>
    <router method="GET" path="/error" handler="Error" isuse="true"></router>
    <router method="GET" path="/panic" handler="Panic" isuse="true"></router>
    <router method="GET" path="/appset" handler="appset" isuse="true"></router>
</routers>
<groups>
    <group path="/admin" isuse="true">
        <middleware name="grouplog" isuse="true" />
        <middleware name="simpleauth" isuse="true" />
        <router method="GET" path="/login" handler="Login" isuse="true">
            <middleware name="urllog" isuse="true" />
        </router>
        <router method="GET" path="/login3" handler="Login" isuse="true"></router>
        <router method="GET" path="/logout" handler="Logout" isuse="true"></router>
        <router method="GET" path="/login2" handler="Login" isuse="true"></router>
    </group>
</groups>
</config> 
      {
    "App": {
        "LogPath": "d:/gotmp/",
        "EnabledLog": true,
        "RunMode": "development",
        "PProfPort": 0,
        "EnabledPProf": false
    },
    "AppSets": [{
        "Key": "set1",
        "Value": "1"
    }, {
        "Key": "set2",
        "Value": "2"
    }, {
        "Key": "set3",
        "Value": "3"
    }, {
        "Key": "set4",
        "Value": "4"
    }],
    "Offline": {
        "Offline": false,
        "OfflineText": "",
        "OfflineUrl": ""
    },
    "Server": {
        "EnabledListDir": false,
        "EnabledRequestID": false,
        "EnabledGzip": false,
        "EnabledAutoHEAD": true,
        "EnabledAutoCORS": false,
        "EnabledIgnoreFavicon": false,
        "EnabledBindUseJsonTag": false,
        "Port": 8080,
        "EnabledTLS": false,
        "TLSCertFile": "",
        "TLSKeyFile": "",
        "IndexPage": "index.html",
        "EnabledDetailRequestData": false
    },
    "Session": {
        "EnabledSession": true,
        "SessionMode": "runtime",
        "Timeout": 20,
        "ServerIP": "",
        "UserName": "",
        "Password": ""
    },
    "Routers": [{
        "Method": "GET",
        "Path": "/index",
        "HandlerName": "Index",
        "Middlewares": [{
            "Name": "urllog",
            "IsUse": true
        }],
        "IsUse": true
    }, {
        "Method": "GET",
        "Path": "/index2",
        "HandlerName": "Index",
        "Middlewares": [{
            "Name": "urllog",
            "IsUse": true
        }],
        "IsUse": true
    }, {
        "Method": "GET",
        "Path": "/index3",
        "HandlerName": "Index",
        "Middlewares": [{
            "Name": "urllog",
            "IsUse": true
        }],
        "IsUse": true
    }, {
        "Method": "GET",
        "Path": "/redirect",
        "HandlerName": "Redirect",
        "Middlewares": null,
        "IsUse": true
    }, {
        "Method": "GET",
        "Path": "/error",
        "HandlerName": "Error",
        "Middlewares": null,
        "IsUse": true
    }, {
        "Method": "GET",
        "Path": "/panic",
        "HandlerName": "Panic",
        "Middlewares": null,
        "IsUse": true
    }, {
        "Method": "GET",
        "Path": "/appset",
        "HandlerName": "appset",
        "Middlewares": null,
        "IsUse": true
    }],
    "Groups": [{
        "Path": "/admin",
        "Routers": [{
            "Method": "GET",
            "Path": "/login",
            "HandlerName": "Login",
            "Middlewares": [{
                "Name": "urllog",
                "IsUse": true
            }],
            "IsUse": true
        }, {
            "Method": "GET",
            "Path": "/login3",
            "HandlerName": "Login",
            "Middlewares": null,
            "IsUse": true
        }, {
            "Method": "GET",
            "Path": "/logout",
            "HandlerName": "Logout",
            "Middlewares": null,
            "IsUse": true
        }, {
            "Method": "GET",
            "Path": "/login2",
            "HandlerName": "Login",
            "Middlewares": null,
            "IsUse": true
        }],
        "Middlewares": [{
            "Name": "grouplog",
            "IsUse": true
        }, {
            "Name": "simpleauth",
            "IsUse": true
        }],
        "IsUse": true
    }],
    "Middlewares": [{
        "Name": "applog",
        "IsUse": true
    }]
}

(5) 路由

  • 支持GET\POST\HEAD\OPTIONS\PUT\PATCH\DELETE 這幾類請(qǐng)求方法
  • 支持HiJack\WebSocket\ServerFile三類特殊應(yīng)用
  • 支持Any注冊(cè)方式,默認(rèn)兼容GET\POST\HEAD\OPTIONS\PUT\PATCH\DELETE方式
  • 支持通過配置開啟默認(rèn)添加HEAD方式
  • 支持注冊(cè)Handler拦英,以啟用配置化
  • 支持檢查請(qǐng)求與指定路由是否匹配
    (6)其他可以借鑒這里:https://www.ctolib.com/dotweb.html

3苞俘、gin框架
Gin是一個(gè)golang的微框架,封裝比較優(yōu)雅龄章,API友好吃谣,源碼注釋比較明確,已經(jīng)發(fā)布了1.0版本做裙。具有快速靈活岗憋,容錯(cuò)方便等特點(diǎn)。其實(shí)對(duì)于golang而言锚贱,web框架的依賴要遠(yuǎn)比Python仔戈,Java之類的要小。自身的net/http足夠簡單,性能也非常不錯(cuò)监徘〗蓿框架更像是一些常用函數(shù)或者工具的集合。借助框架開發(fā)凰盔,不僅可以省去很多常用的封裝帶來的時(shí)間墓卦,也有助于團(tuán)隊(duì)的編碼風(fēng)格和形成規(guī)范。
下面就Gin的用法做一個(gè)簡單的介紹户敬。
首先需要安裝落剪,安裝比較簡單,使用go get即可:

$ go get gopkg.in/gin-gonic/gin.v1

gin的版本托管再 gopkg的網(wǎng)站上尿庐。我在安裝的過程中忠怖,gokpg卡住了,后來不得不根據(jù)gin里的godep的文件抄瑟,把響應(yīng)的源碼從github上下載凡泣,然后copy到對(duì)應(yīng)的目錄。

package main
import (
    "gopkg.in/gin-gonic/gin.v1"
    "net/http"
)

func main(){

    router := gin.Default()

    router.GET("/", func(c *gin.Context) {
        c.String(http.StatusOK, "Hello World")
    })
    router.Run(":8000")
}

簡單幾行代碼皮假,就能實(shí)現(xiàn)一個(gè)web服務(wù)鞋拟。使用gin的Default方法創(chuàng)建一個(gè)路由handler。然后通過HTTP方法綁定路由規(guī)則和路由函數(shù)钞翔。不同于net/http庫的路由函數(shù)严卖,gin進(jìn)行了封裝,把request和response都封裝到gin.Context的上下文環(huán)境布轿。最后是啟動(dòng)路由的Run方法監(jiān)聽端口哮笆。麻雀雖小,五臟俱全汰扭。當(dāng)然稠肘,除了GET方法,gin也支持POST,PUT,DELETE,OPTION等常用的restful方法萝毛。

restful路由,gin的路由來自httprouter庫项阴。因此httprouter具有的功能,gin也具有笆包,不過gin不支持路由正則表達(dá)式:

func main(){
    router := gin.Default()

    router.GET("/user/:name", func(c *gin.Context) {
        name := c.Param("name")
        c.String(http.StatusOK, "Hello %s", name)
    })
}

冒號(hào):加上一個(gè)參數(shù)名組成路由參數(shù)环揽。可以使用c.Params的方法讀取其值庵佣。當(dāng)然這個(gè)值是字串string歉胶。諸如/user/rsj217,和/user/hello都可以匹配巴粪,而/user/和/user/rsj217/不會(huì)被匹配通今。除了:粥谬,gin還提供了號(hào)處理參數(shù),號(hào)能匹配的規(guī)則就更多辫塌。

func main(){
    router := gin.Default()

    router.GET("/user/:name/*action", func(c *gin.Context) {
        name := c.Param("name")
        action := c.Param("action")
        message := name + " is " + action
        c.String(http.StatusOK, message)
    })
}

參考:https://studygolang.com/articles/11819?fr=sidebar

4漏策、iris
(1) github地址https://github.com/kataras/iris

(2) 文檔https://docs.iris-go.com/

(3) 安裝

$ go get -u github.com/kataras/iris

(4)簡單的Hello world

package main

   import "github.com/kataras/iris"

   func main() {
     app := iris.Default()

     // Method:   GET
     // Resource: http://localhost:8080/
     app.Handle("GET", "/", func(ctx iris.Context) {
       ctx.HTML("Hello world!")
     })

     // same as app.Handle("GET", "/ping", [...])
     // Method:   GET
     // Resource: http://localhost:8080/ping
     app.Get("/ping", func(ctx iris.Context) {
       ctx.WriteString("pong")
     })

     // Method:   GET
     // Resource: http://localhost:8080/hello
     app.Get("/hello", func(ctx iris.Context) {
       ctx.JSON(iris.Map{"message": "Hello iris web framework."})
     })

     // http://localhost:8080
     // http://localhost:8080/ping
     // http://localhost:8080/hello
     app.Run(iris.Addr(":8080"))
   }

(5)運(yùn)行
> $ go run main.go
新打開個(gè)窗口執(zhí)行
curl http://localhost:8080
結(jié)果 Hello world!
或在瀏覽器 訪問http://localhost:8080

原文:https://blog.csdn.net/guyan0319/article/details/80625913

5、echo
(1)安裝

$ go get github.com/labstack/echo/...
(2) 編寫Hello World

package main

import (
    "net/http"
    "github.com/labstack/echo"
)

func main() {
    e := echo.New()
    e.GET("/", func(c echo.Context) error {
        return c.String(http.StatusOK, "Hello, World!")
    })
    e.Logger.Fatal(e.Start(":1323"))
}

啟動(dòng)服務(wù)

$ go run server.go
用在瀏覽器訪問 http://localhost:1323 然后你就能在頁面上看到 Hello, World!

(3) 路由
e.POST("/users", saveUser)
e.GET("/users/:id", getUser)
e.PUT("/users/:id", updateUser)
e.DELETE("/users/:id", deleteUser)

其他操作可以參考:http://go-echo.org
原文:http://go-echo.org

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末臼氨,一起剝皮案震驚了整個(gè)濱河市掺喻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌一也,老刑警劉巖巢寡,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件喉脖,死亡現(xiàn)場(chǎng)離奇詭異椰苟,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)树叽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門舆蝴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人题诵,你說我怎么就攤上這事洁仗。” “怎么了性锭?”我有些...
    開封第一講書人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵赠潦,是天一觀的道長。 經(jīng)常有香客問我草冈,道長她奥,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任怎棱,我火速辦了婚禮哩俭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拳恋。我一直安慰自己凡资,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開白布谬运。 她就那樣靜靜地躺著隙赁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪梆暖。 梳的紋絲不亂的頭發(fā)上伞访,一...
    開封第一講書人閱讀 50,096評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音式廷,去河邊找鬼咐扭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蝗肪。 我是一名探鬼主播袜爪,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼薛闪!你這毒婦竟也來了辛馆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤豁延,失蹤者是張志新(化名)和其女友劉穎昙篙,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诱咏,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡苔可,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了袋狞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片焚辅。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖苟鸯,靈堂內(nèi)的尸體忽然破棺而出同蜻,到底是詐尸還是另有隱情,我是刑警寧澤早处,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布湾蔓,位于F島的核電站,受9級(jí)特大地震影響砌梆,放射性物質(zhì)發(fā)生泄漏默责。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一么库、第九天 我趴在偏房一處隱蔽的房頂上張望傻丝。 院中可真熱鬧,春花似錦诉儒、人聲如沸葡缰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泛释。三九已至,卻和暖如春温算,著一層夾襖步出監(jiān)牢的瞬間怜校,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來泰國打工注竿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留茄茁,地道東北人蘑斧。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓强饮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子职辅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)發(fā)自:http://shanshanpt.github.io/2016/05/03/go-gin.html gi...
    dncmn閱讀 6,033評(píng)論 0 1
  • Faygo 框架 Faygo 使用全新架構(gòu)筝闹,是最合適開發(fā)API接口的Go Web框架街图。用戶只需定義一個(gè)struct...
    Andeya閱讀 21,685評(píng)論 5 27
  • 學(xué)習(xí)go也有一段時(shí)間了阻荒,整理了一下學(xué)習(xí)go的心得體會(huì)。結(jié)合一個(gè)web框架構(gòu)建來體會(huì)一下漩怎。demo地址1 路由以及數(shù)...
    熊少年閱讀 1,493評(píng)論 0 0
  • 2019-01-13 星期日勋颖,天氣晴 周末時(shí)光總是這么短暫,這周末在家打了兩天游戲勋锤,將段位提高到一個(gè)前所未有的高度...
    涼城丶丶舊夢(mèng)閱讀 101評(píng)論 0 0
  • 說真的看到簡書上的你們都怎么努力饭玲,我真的覺得自己特別特別懶散,現(xiàn)在大二了怪得,學(xué)習(xí)一般般咱枉,什么特長也沒有卑硫,做事情三分鐘...
    呆毛怪閱讀 254評(píng)論 0 0