package main
import (
"fmt"
"reflect"
)
type Handler interface{}
type context struct {
handlers []Handler
index int
}
func (c *context) handler() Handler {
if c.index < len(c.handlers) {
return c.handlers[c.index]
}
if c.index == len(c.handlers) {
return func() {
println("do end")
}
}
panic("invalid index for context handler")
}
func (c *context) Next() {
c.index += 1
c.run()
}
func (c *context) run() {
for c.index <= len(c.handlers) {
val := reflect.ValueOf(c.handler())
val.Call(nil)
c.index += 1
}
}
func (c *context) use(handler Handler) {
validateHandler(handler)
c.handlers = append(c.handlers, handler)
}
func validateHandler(handler Handler) {
if reflect.TypeOf(handler).Kind() != reflect.Func {
panic("handler 非函数")
}
}
func main() {
ctx := new(context)
ctx.use(func() {
ctx.Next()
fmt.Println("函数1")
})
ctx.use(func() {
fmt.Println("函数2")
ctx.Next()
})
ctx.use(func() {
fmt.Println("函数3")
})
ctx.run()
}
gin 和 martini的Next()方法总结起来
Next()前的代码会被先执行
执行Next()方法后,会执行后续的Handler
后续的Handler执行结束后
会继续执行Next()后的代码