go 中间件洋葱模型

本文介绍了Golang中洋葱模型的概念,通过一个简单的示例展示了如何使用中间件模拟Gin框架的中间件执行流程。代码中,`Context`对象保存handler函数列表,`Use`和`Get`函数用于添加中间件和具体路由处理函数,`Next`方法使得中间件按顺序执行,最后通过`Run`启动处理流程。示例还解释了中间件的执行顺序和如何在handler之间插入额外的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

内容来自:Golang公开课(8):月经面试题之gin的中间件原理和简单手撸_哔哩哔哩_bilibili

一、go洋葱模型图

 二、中间件模拟示例代码

package main

import "fmt"

type Context struct {
	handlers []func(c *Context)  // 保存handler函数的切片
	index int8                   //记录handler切片的当前位置
}
// Use 将一个要执行的handler函数放到 handlers切片中
func(this *Context) Use(f func(c *Context)) {
	this.handlers = append(this.handlers,f)
}

// Get 将一个要执行的handler函数放到 handlers切片中
func(this *Context) Get(path string,f func(c *Context)){
	this.handlers = append(this.handlers,f)
}
// Next 执行handlers 切片列表中的下一个handler函数
func(this *Context) Next() {
	this.index++
	this.handlers[this.index](this) //剥洋葱的下一层
}

// Run 启动开始执行 handlers切片中第一个 handler函数
func(this *Context) Run() {
	this.handlers[0](this) //剥洋葱,第一层
}

func main() {
	c := &Context{}
	c.Use(Middleware1())
	c.Use(Middleware2())
	c.Get("/", func(c *Context) {
		fmt.Println("Get handlerfunc  run")
	})
	c.Run()
}

// Middleware1 中间件函数 返回一个带有具体业务的handler函数
func Middleware1() func(c *Context) {
	return func(c *Context) {
		fmt.Println("middl1 --- start")
		c.Next() //执行下一个handler函数
		fmt.Println("middl1 --- end")
	}
}
// Middleware2 中间件函数 返回一个带有具体业务的handler函数
func Middleware2() func(c *Context) {
	return func(c *Context) {
		fmt.Println("middl2 --- start")
		c.Next() //执行下一个handler函数
		fmt.Println("middl2 --- end")
	}
}

执行结果:

三、理解代码实现

1. Context对象可以保存 可执行的handler函数列表

2.Use函数执行的目的是将 某个可执行的handler函数追加到函数列表中,而这追加的函数里携带有 Next函数。 按照程序执行顺序,那么其意思是执行某个函数的一半时,在中间插入一段另一个函数的执行,如果另一个函数执行完,那么就继续执行当前函数后半段。 如下代码示例:

package main

import "fmt"


func main() {

	F1()

}

func F1() {
	fmt.Println("F1 start")

	// Next() 执行下一个函数(相当于F1中间插入一段代码)
	F2()

	fmt.Println("F1 end")
}

func F2() {
	fmt.Println("F2 start")
	fmt.Println("F2 end")
}

执行结果:

 

3.Get函数,则是没有Next()执行的函数,即洋葱的最中间,handlers列表中最后一个函数了,执行完后则逐步执行上一个函数的后半段,一层层返回到外面

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值