type Handler interface {
Handle(request *Request, response *Response, chain FilterChain) error
}
type FilterChain []Handler
func (fc FilterChain) Proceed(request Request, response Response) error {
if len(fc) == 0 {
return nil // 到达链尾
}
head := fc[0]
tail := fc[1:]
return head.Handle(request, response, tail)
}
FilterChainProceed// 日志处理器
type LoggingHandler struct{}
func (l LoggingHandler) Handle(req Request, resp *Response, chain FilterChain) error {
fmt.Println("开始处理请求:", req.Path)
err := chain.Proceed(req, resp)
fmt.Println("请求处理完成,状态:", resp.Status)
return err
}
// 身份验证处理器
type AuthHandler struct{}
func (a AuthHandler) Handle(req Request, resp *Response, chain FilterChain) error {
if req.Headers["Authorization"] == "" {
resp.Status = 401
resp.Body = "Unauthorized"
return nil // 不继续向下传递
}
return chain.Proceed(req, resp)
}
// 参数校验处理器
type ValidationHandler struct{}
func (v ValidationHandler) Handle(req Request, resp *Response, chain FilterChain) error {
if req.Body == "" {
resp.Status = 400
resp.Body = "Bad Request: missing body"
return nil
}
return chain.Proceed(req, resp)
}
type Request struct {
Path string
Headers map[string]string
Body string
}
type Response struct {
Status int
Body string
}
func main() {
request := &Request{
Path: "/api/v1/data",
Headers: map[string]string{"Authorization": "token-123"},
Body: {"key":"value"},
}
response := &Response{}
chain := FilterChain{
&LoggingHandler{},
&AuthHandler{},
&ValidationHandler{},
}
err := chain.Proceed(request, response)
if err != nil {
fmt.Println("处理出错:", err)
}
fmt.Printf("响应: %d - %s\n", response.Status, response.Body)Handletype AroundHandler func(
req *Request,
resp *Response,
next func() error,
) errorfunc Adapt(fn AroundHandler) Handler {
return &adapter{fn}
}
type adapter struct {
fn AroundHandler
}
func (a adapter) Handle(req Request, resp *Response, chain FilterChain) error {
return a.fn(req, resp, func() error {
return chain.Proceed(req, resp)
})
}
timing := Adapt(func(req *Request, resp *Response, next func() error) error {
start := time.Now()
err := next()
fmt.Printf("处理耗时: %v\n", time.Since(start))
return err
})