「GoCN酷Go推荐」一款简洁的、极易扩展且模块化的Go Web框架Flamego

共 7522字,需浏览 16分钟

 ·

2022-04-18 02:17

安装

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/httphttp.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

总结

FlamegoMacaron框架的继任者,Flamego具备了当下 Go 语言生态中最强大的路由配置语法,通过依赖注入将服务模块化,所以极易扩展,同时也很轻量简洁,官方生态也很好,是一款十分优秀的框架

官方文档:https://flamego.cn


酷Go推荐》招募:


各位Gopher同学,最近我们社区打算推出一个类似GoCN每日新闻的新栏目《酷Go推荐》,主要是每周推荐一个库或者好的项目,然后写一点这个库使用方法或者优点之类的,这样可以真正的帮助到大家能够学习到

新的库,并且知道怎么用。


大概规则和每日新闻类似,如果报名人多的话每个人一个月轮到一次,欢迎大家报名!戳「阅读原文」,即可报名


想要了解更多 Golang 相关的内容,欢迎扫描下方👇 关注 公众号,回复关键词 [实战群]  ,就有机会进群和我们进行交流~



浏览 30
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报