「GoCN酷Go推薦」一款簡(jiǎn)潔的、極易擴(kuò)展且模塊化的Go Web框架Flamego
go get github.com/flamego/flamego
package main
import "github.com/flamego/flamego"
func main(){
f := flamego.Classic()
f.Get("/", func() string {
return "hello world"
})
f.Run(8000)
}
實(shí)例
Flame實(shí)例實(shí)現(xiàn)了標(biāo)準(zhǔn)庫(kù)net/http中http.Handler接口,所以可以被集成到任何接受http.Handler作為參數(shù)的地方
flamego.New可以創(chuàng)建一個(gè)沒有注冊(cè)任何中間件的實(shí)例,并且任何包含flamego.Flame的類型都可以被視為一個(gè)Flame實(shí)例
每個(gè)Flame實(shí)例都是獨(dú)立于其他Flame實(shí)例而存在的,不會(huì)互相影響
func main() {
f1 := flamego.New()
f2 := flamego.New()
f2.Use(flamego.Recovery())
}
處理器
任何實(shí)現(xiàn)了flamego.Handler的函數(shù)/方法都可以被視為處理器,處理器用來執(zhí)行路由匹配后的動(dòng)作
func main() {
f := flamego.New()
f.Get("/anonymous", func() string {
return "Respond from an anonymous function"
})
f.Get("/declared", declared)
t := &customType{}
f.Get("/method", t.handler)
f.Run()
}
func declared() string {
return "Respond from a declared function"
}
type customType struct{}
func (t *customType) handler() string {
return "Respond from a method of a type"
}
中間件
中間件是一種特殊的處理器,它們被設(shè)計(jì)為可復(fù)用的組件并允許用戶通過配置選項(xiàng)進(jìn)行自定義,中間件可以被用在任何接受flamego.Handler類型的地方,包括全局、組級(jí)或路由級(jí)。
// 全局中間件會(huì)在其它所有中間件和處理器之前被調(diào)用
f.Use(middleware1, middleware2, middleware3)
// 組級(jí)中間件僅在組內(nèi)定義的路由被匹配時(shí)才被調(diào)用
f.Group("/",
func(){
f.Get("/hello", func() { ... })
},
middleware4, middleware5, middleware6,
)
// 路由級(jí)中間件僅在所綁定的路由被匹配時(shí)才被調(diào)用
f.Get("/hi", middleware7, middleware8, middleware9, func() { ... })
自定義中間件,其實(shí)就是自定義處理器,不同的是可以使用flamego.Context的方法Next()暫停一個(gè)處理執(zhí)行
func Middleware1(c flamego.Context){
fmt.Println("starting the first handler")
c.Next()
fmt.Println("exiting the first handler")
}
func Middleware2(){
fmt.Println("executing the second handler")
}
f := flamego.New()
f.Use(Middleware1, Middleware2)
f.Get("/", func(){
fmt.Println("hello world")
})
f.Run()
服務(wù)注入
Flamego的依賴注入思想主要體現(xiàn)在服務(wù)注入上,是整個(gè)框架的靈魂所在
看一個(gè)服務(wù)注入的例子:
l := log.New(os.Stdout, "[Flamego] ", 0)
f := flamego.New()
// 將服務(wù)注入到Flame實(shí)例
f.Map(l)
// 可以在任意處理器中使用
f.Get("/", func(l *log.Logger){
l.Println("hello world")
})
Flame內(nèi)置了很多服務(wù),比如flamego.Content請(qǐng)求上下文,flamego.Recovery()Panic恢復(fù),flamego.Static管理靜態(tài)資源,flamego.Renderer渲染內(nèi)容等等
當(dāng)然可以自定義服務(wù),并且可以設(shè)置服務(wù)范圍,全局級(jí)別,組級(jí)別,路由級(jí)別,詳情可以查看文檔
路由
Flamego在路由系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)上花費(fèi)了大量精力,在確保易用性的同時(shí)保留了未來的可擴(kuò)展性。
// 靜態(tài)路由
f.Get("/user", ...)
// 動(dòng)態(tài)路由
f.Get("/posts/{year}-{month}-{day}.html", ...)
// 正則表達(dá)式
f.Get("/users/{name: /[a-zA-Z0-9]+/}", ...)
// 通配符
f.Get("/webhooks/{repo: **}/events", ...)
// 路由組
f.Group("/user", func() {
f.Get("/info", ...)
f.Group("/settings", func() {
f.Get("", ...)
f.Get("/account_security", ...)
}, middleware3)
}, middleware1, middleware2)
// 可選路由
f.Get("/user/?settings", ...)
// 設(shè)置別名
f.Get("/user/?settings", ...).Name("UserSettings")
// 構(gòu)建URL
c.URLPath("UserSettings") // => /user
c.URLPath("UserSettings", "withOptional", "true") // => /user/settings
c.URLPath("UsersName", "name", "joe") // => /users/joe
Flamego是Macaron框架的繼任者,Flamego具備了當(dāng)下 Go 語言生態(tài)中最強(qiáng)大的路由配置語法,通過依賴注入將服務(wù)模塊化,所以極易擴(kuò)展,同時(shí)也很輕量簡(jiǎn)潔,官方生態(tài)也很好,是一款十分優(yōu)秀的框架
官方文檔:https://flamego.cn
《酷Go推薦》招募:
各位Gopher同學(xué),最近我們社區(qū)打算推出一個(gè)類似GoCN每日新聞的新欄目《酷Go推薦》,主要是每周推薦一個(gè)庫(kù)或者好的項(xiàng)目,然后寫一點(diǎn)這個(gè)庫(kù)使用方法或者優(yōu)點(diǎn)之類的,這樣可以真正的幫助到大家能夠?qū)W習(xí)到
新的庫(kù),并且知道怎么用。
大概規(guī)則和每日新聞?lì)愃?,如果?bào)名人多的話每個(gè)人一個(gè)月輪到一次,歡迎大家報(bào)名!戳「閱讀原文」,即可報(bào)名
想要了解更多 Golang 相關(guān)的內(nèi)容,歡迎掃描下方?? 關(guān)注 公眾號(hào),回復(fù)關(guān)鍵詞 [實(shí)戰(zhàn)群] ,就有機(jī)會(huì)進(jìn)群和我們進(jìn)行交流~
