go的web框架的context回调的原理
package main
import "fmt"
type ctx struct {
name string
idx int8
h handlers
}
/*
*
idx=0 func1 start
idx = 1 func2 start
idx = 2 func3 start
idx = 3 return
idx =1 func2 end
idx=0 func1 end
*
*/
func (c *ctx) next() {
c.idx++
fmt.Printf("idx:%d\n", c.idx)
for c.idx < int8(len(c.h)) {
c.h[c.idx](c)
c.idx++
}
}
type handler func(*ctx)
type handlers []handler
type engin struct {
name string
hds handlers
}
func (e *engin) run(c *ctx) {
fmt.Printf("engine:%s running\n", e.name)
c.h = e.hds
c.next()
fmt.Printf("engine:%s end\n", e.name)
}
func main() {
testHandler()
}
func testHandler() {
h1 := func(c *ctx) {
fmt.Println("h1 start")
c.next()
fmt.Println("h1 end")
}
h2 := func(c *ctx) {
fmt.Println("h2 start")
c.next()
fmt.Println("h2 end")
}
h3 := func(c *ctx) {
fmt.Println("h3 running...")
}
hds := make([]handler, 3)
hds[0] = h1
hds[1] = h2
hds[2] = h3
c1 := &ctx{
idx: -1,
name: "ctx1",
}
engin1 := &engin{
name: "engin1",
hds: hds,
}
engin1.run(c1)
}
结果
engine:engin1 running idx:0 h1 start idx:1 h2 start idx:2 h3 running... h2 end h1 end engine:engin1 end
浙公网安备 33010602011771号