函数注册

函数注册方式是最简单且最灵活的的路由注册方式,注册的路由handler可以是一个实例化对象的方法地址,也可以是一个包方法地址。相关方法:

func (s *Server) BindHandler(pattern string, handler interface{})

使用示例

Hello World

我们来看一个简单的示例:

package main

import (
    "github.com/gogf/gf/v2/frame/g"
    "github.com/gogf/gf/v2/net/ghttp"
)

func main() {
    s := g.Server()
    s.BindHandler("/", func(r *ghttp.Request) {
        r.Response.Write("哈喽世界!")
    })
    s.SetPort(8199)
    s.Run()
}

执行后,我们访问 http://127.0.0.1:8199 可以看到我们熟悉的内容。

包方法注册

注册的路由函数handler参数可以是一个包方法,例如:

package main

import (
	"github.com/gogf/gf/v2/container/gtype"
	"github.com/gogf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/net/ghttp"
)

var (
	total = gtype.NewInt()
)

func Total(r *ghttp.Request) {
	r.Response.Write("total:", total.Add(1))
}

func main() {
	s := g.Server()
	s.BindHandler("/total", Total)
	s.SetPort(8199)
	s.Run()
}

在该示例中,我们通过包方法的形式来注册路由。该方法返回总共访问的次数,由于涉及到并发安全,因此total变量使用了gtype.Int并发安全类型。执行后,当我们不停访问 http://127.0.0.1:8199/total 时,可以看到返回的数值不停递增。

对象方法注册

注册的路由函数handler参数可以是一个对象的方法,例如:

package main

import (
	"github.com/gogf/gf/v2/container/gtype"
	"github.com/gogf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/net/ghttp"
)

type Controller struct {
	total *gtype.Int
}

func (c *Controller) Total(r *ghttp.Request) {
	r.Response.Write("total:", c.total.Add(1))
}

func main() {
	s := g.Server()
	c := &Controller{
		total: gtype.NewInt(),
	}
	s.BindHandler("/total", c.Total)
	s.SetPort(8199)
	s.Run()
}

该示例与示例1的实现的效果一致,但我们使用了对象来封装业务逻辑所需的变量,使用路由函数注册来灵活注册对应的对象方法。




Content Menu

  • No labels

7 Comments

  1. 有注册路由,为何没有注销路由

    1. 有啥场景需要注销路由?

  2. 如果有一份经常变动的路由列表配置,我怎么在s.Run()之后重新s.BindHandler注册路由呢?也就是说,如何动态的注册可能变化的路由

    1. 这个问题有什么进展吗,我也想要动态注册路由,但是好像在s.Run之后再调用BindHandler并不起作用。

      1. 不支持Server在运行时注册路由,那样运行时效率会比较低,建议自行在中间件或者Handler中做路由转发。

  3. 注册路由的时候能否设置为静态资源,而不是用s.AddStaticPath

  4. 写的不够严谨, 包方法,应该称之为 包函数

    不过这个操作全局变量的例子挺赞的,不用gtype类型,我测试也可以,请问这块【不适用gtype类型】有坑不?