常见问题

如何集成到我已有的服务中?

每个 Macaron 实例 都实现了 http.Handler 接口,因此可以很容易地将它们以子集的形式集成到已有服务中。例如,您可以将 Macaron 应用集成到 GAE 中:

  1. package hello
  2.  
  3. import (
  4. "net/http"
  5.  
  6. "gopkg.in/macaron.v1"
  7. )
  8.  
  9. func init() {
  10. m := macaron.Classic()
  11. m.Get("/", func() string {
  12. return "Hello world!"
  13. })
  14. http.Handle("/", m)
  15. }

如何修改监听地址和端口?

Macaron 的 Run 函数会首先根据环境变量 PORTHOST 来确定监听地址和端口。如果未找到相应设置,则会默认使用 localhost:4000。如果您想要更加灵活便利的方案,可以使用 http.ListenAndServe 函数来实现。

  1. m := macaron.Classic()
  2. // ...
  3. log.Fatal(http.ListenAndServe(":8080", m))

或者以下方式:

  • m.Run("0.0.0.0"),监听在 0.0.0.0:4000
  • m.Run(8080),监听在 0.0.0.0:8080
  • m.Run("0.0.0.0", 8080),监听在 0.0.0.0:8080

如何优雅地终止程序(Graceful Shutdown)?

  1. package main
  2.  
  3. import (
  4. ...
  5. "net/http"
  6.  
  7. "gopkg.in/macaron.v1"
  8. "gopkg.in/tylerb/graceful.v1"
  9. )
  10.  
  11. func main() {
  12. m := macaron.Classic()
  13.  
  14. ...
  15.  
  16. mux := http.NewServeMux()
  17. mux.Handle("/", m)
  18. graceful.Run(":4000", 60*time.Second, mux)
  19. }

除了注入服务以外,如何在同一个请求内传递数据?

对象 *macaron.Context 中包含一个类型为 map[string]interface{} 的字段 Data 可供您在同个请求的不同处理器之间传递数据。

可以到 这里 查看使用方法。

为什么不直接使用 Martini 而要另外创建一个框架?

  • 集成常用组件和方法来减少反射次数。
  • 使用速度更快的多叉树路由替换原本的路由层。
  • 更好地驱动 Gogs 项目。
  • 对 Martini 源码进行一次深度学习。

为什么 Logo 是一条龙?

不应该是一种甜品吗?

正所谓 马卡龙,此龙乃是名为 马卡 的龙,哈哈!

有代码实时编译运行工具吗?

Bra 可以作为 Macaron 及其它应用的实时编译运行工具。