「GoCN酷Go推荐」一款简洁的、极易扩展且模块化的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)
}
实例
Flame实例实现了标准库net/http
中http.Handler
接口,所以可以被集成到任何接受http.Handler
作为参数的地方
flamego.New
可以创建一个没有注册任何中间件的实例,并且任何包含flamego.Flame
的类型都可以被视为一个Flame实例
每个Flame实例都是独立于其他Flame实例而存在的,不会互相影响
func main() {
f1 := flamego.New()
f2 := flamego.New()
f2.Use(flamego.Recovery())
}
处理器
任何实现了flamego.Handler
的函数/方法都可以被视为处理器,处理器用来执行路由匹配后的动作
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"
}
中间件
中间件是一种特殊的处理器,它们被设计为可复用的组件并允许用户通过配置选项进行自定义,中间件可以被用在任何接受flamego.Handler
类型的地方,包括全局、组级或路由级。
// 全局中间件会在其它所有中间件和处理器之前被调用
f.Use(middleware1, middleware2, middleware3)
// 组级中间件仅在组内定义的路由被匹配时才被调用
f.Group("/",
func(){
f.Get("/hello", func() { ... })
},
middleware4, middleware5, middleware6,
)
// 路由级中间件仅在所绑定的路由被匹配时才被调用
f.Get("/hi", middleware7, middleware8, middleware9, func() { ... })
自定义中间件,其实就是自定义处理器,不同的是可以使用flamego.Context的方法Next()暂停一个处理执行
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()
服务注入
Flamego
的依赖注入
思想主要体现在服务注入上,是整个框架的灵魂所在
看一个服务注入的例子:
l := log.New(os.Stdout, "[Flamego] ", 0)
f := flamego.New()
// 将服务注入到Flame实例
f.Map(l)
// 可以在任意处理器中使用
f.Get("/", func(l *log.Logger){
l.Println("hello world")
})
Flame
内置了很多服务,比如flamego.Content
请求上下文,flamego.Recovery()
Panic恢复,flamego.Static
管理静态资源,flamego.Renderer
渲染内容等等
当然可以自定义服务,并且可以设置服务范围,全局级别,组级别,路由级别,详情可以查看文档
路由
Flamego
在路由系统的设计和实现上花费了大量精力,在确保易用性的同时保留了未来的可扩展性。
// 静态路由
f.Get("/user", ...)
// 动态路由
f.Get("/posts/{year}-{month}-{day}.html", ...)
// 正则表达式
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", ...)
// 设置别名
f.Get("/user/?settings", ...).Name("UserSettings")
// 构建URL
c.URLPath("UserSettings") // => /user
c.URLPath("UserSettings", "withOptional", "true") // => /user/settings
c.URLPath("UsersName", "name", "joe") // => /users/joe
Flamego
是Macaron框架
的继任者,Flamego
具备了当下 Go 语言生态中最强大的路由配置语法,通过依赖注入将服务模块化,所以极易扩展,同时也很轻量简洁,官方生态也很好,是一款十分优秀的框架
官方文档:https://flamego.cn
《酷Go推荐》招募:
各位Gopher同学,最近我们社区打算推出一个类似GoCN每日新闻的新栏目《酷Go推荐》,主要是每周推荐一个库或者好的项目,然后写一点这个库使用方法或者优点之类的,这样可以真正的帮助到大家能够学习到
新的库,并且知道怎么用。
大概规则和每日新闻类似,如果报名人多的话每个人一个月轮到一次,欢迎大家报名!戳「阅读原文」,即可报名
想要了解更多 Golang 相关的内容,欢迎扫描下方👇 关注 公众号,回复关键词 [实战群] ,就有机会进群和我们进行交流~