一、Gin框架核心
1. 中间件执行顺序及c.Next()作用
核心逻辑
Gin中间件遵循洋葱模型,执行顺序由注册顺序决定,c.Next()是“前置逻辑”与“后置逻辑”的分界点:
- 前置逻辑:按注册顺序执行(先注册先执行);
- 后置逻辑:按注册逆序执行(后注册先执行);
c.Abort()会终止后续中间件/路由执行,直接进入后置逻辑。
代码示例
packagemainimport("github.com/gin-gonic/gin""fmt")funcm1()gin.HandlerFunc{returnfunc(c*gin.Context){fmt.Println("m1 前置")c.Next()fmt.Println("m1 后置")}}funcm2()gin.HandlerFunc{returnfunc(c*gin.Context){fmt.Println("m2 前置")c.Next()fmt.Println("m2 后置")}}funcmain(){r:=gin.Default()r.Use(m1(),m2())r.GET("/test",func(c*gin.Context){fmt.Println("路由执行")c.JSON(200,gin.H{"msg":"ok"})})r.Run(":8080")}
执行结果:
m1 前置 → m2 前置 → 路由执行 → m2 后置 → m1 后置
二、Go性能分析
1. pprof工具使用
核心定位
内置性能分析工具,支持CPU、内存、协程、阻塞等维度分析,分两种使用方式:
| 使用方式 | 适用场景 | 核心命令 |
|---|
| HTTP方式 | 服务端 | import _ "net/http/pprof"+http.ListenAndServe(":6060", nil) |
| 命令行方式 | 独立程序 | pprof.StartCPUProfile(f)+pprof.StopCPUProfile() |
常用分析命令
# CPU分析(采样10秒)go tool pprof http://localhost:6060/debug/pprof/profile?seconds=10# 内存分析go tool pprof http://localhost:6060/debug/pprof/heap# 协程分析go tool pprof http://localhost:6060/debug/pprof/goroutine
三、Go语法核心
1. defer与return的交互
| 返回值类型 | 是否可修改 | 示例 | 结果 |
|---|
| 命名返回变量 | 是 | func f() (res int) { res=10; defer func(){res=20}(); return res } | 20 |
| 匿名返回值 | 否 | func f() int { res=10; defer func(){res=20}(); return res } | 10 |
| 指针类型 | 是 | func f() *int { res=10; defer func(){*&res=20}(); return &res } | 20 |
2. Channel核心(sendq/recvq)
底层结构
typehchanstruct{qcountuint// 队列元素数dataqsizuint// 缓冲区容量buf unsafe.Pointer// 缓冲区指针recvq waitq// 接收阻塞协程队列sendq waitq// 发送阻塞协程队列lock mutex// 互斥锁}
核心作用
| 队列 | 触发场景 | 设计目的 |
|---|
| sendq | 无缓冲Channel无接收方/有缓冲Channel缓冲区满 | 存储阻塞的发送协程,实现同步通信 |
| recvq | 无缓冲Channel无发送方/有缓冲Channel缓冲区空 | 存储阻塞的接收协程,保证数据有序传递 |
设计优势
- 解耦发送/接收协程,无需严格同步;
- FIFO队列保证公平性,避免协程饥饿;
- 统一处理无缓冲/有缓冲Channel的阻塞逻辑。
3. 泛型vs Interface
| 维度 | 泛型编程 | Interface |
|---|
| 核心定位 | 类型抽象(约束数据类型) | 行为抽象(约束方法集合) |
| 类型确定 | 编译期(实例化生成专用代码) | 运行期(通过iface/eface获取类型) |
| 性能开销 | 无运行时开销 | 类型查找/断言开销 |
| 适用场景 | 通用算法/数据结构(如通用排序) | 多态行为封装(如io.Reader) |
代码示例
// 泛型:编译期确定类型funcSum[Tint|float64](s[]T)T{varres Tfor_,v:=ranges{res+=v}returnres}// Interface:运行期确定类型typeFormatterinterface{Format()string}funcPrint(f Formatter){fmt.Println(f.Format())// 运行时确定具体类型}
四、并发编程
1. 奇偶有序打印(Channel实现)
packagemainimport"fmt"funcmain(){max:=10odd,even:=make(chanstruct{}),make(chanstruct{})// 奇数协程gofunc(){fori:=1;i<=max;i+=2{<-odd fmt.Println(i)even<-struct{}{}}}()// 偶数协程gofunc(){fori:=2;i<=max;i+=2{<-even fmt.Println(i)ifi==max{close(odd)return}odd<-struct{}{}}}()odd<-struct{}{}// 启动流程<-even// 阻塞等待}
2. 高并发模拟方案
| 方案 | 适用场景 | 核心工具 |
|---|
| 原生协程 | 低并发验证 | sync.WaitGroup |
| 协程池 | 高并发(10万+) | ants库 |
| 工具压测 | HTTP接口 | go-wrk/hey |
协程池示例
packagemainimport("fmt""sync""time""github.com/panjf2000/ants/v2")funcmain(){pool,_:=ants.NewPool(1000)// 最大并发1000deferpool.Release()varwg sync.WaitGroup wg.Add(10000)start:=time.Now()fori:=0;i<10000;i++{_=pool.Submit(func(){deferwg.Done()time.Sleep(100*time.Millisecond)})}wg.Wait()fmt.Printf("耗时:%v\n",time.Since(start))}
五、微服务架构
1. 微服务框架对比(Kratos vs Go-Zero)
| 维度 | Kratos | Go-Zero |
|---|
| 定位 | 企业级、高可扩展 | 轻量、一站式 |
| 代码生成 | 基于Protobuf | goctl工具(API/Proto双驱动) |
| 服务治理 | 组件解耦、按需集成 | 开箱即用、全量内置 |
| 通信协议 | 优先gRPC | HTTP/gRPC双支持 |
| 适用场景 | 大规模集群、定制化 | 中小项目、快速落地 |
2. CAP理论
| 特性 | 定义 | 取舍场景 | 典型案例 |
|---|
| C(一致性) | 所有节点数据实时一致 | CP:金融交易 | Redis主从同步 |
| A(可用性) | 所有请求有限时间响应 | AP:电商展示 | 商品库存异步同步 |
| P(分区容错) | 网络分区仍可用 | 分布式必选 | 所有分布式系统 |
3. API设计与问题排查
(1)API响应慢排查流程
(2)优质API设计标准
| 维度 | 核心要求 |
|---|
| 语义规范 | RESTful风格 + 版本控制 |
| 响应格式 | 统一code/msg/data结构 |
| 可用性 | 幂等性 + 限流降级 |
| 安全性 | 鉴权 + HTTPS + 防注入 |
| 扩展性 | 预留扩展字段 + 批量操作 |
4. 登录与会话管理
(1)登录流程
前端加密密码 → 后端验证 → 生成凭证(JWT/SessionID)→ 前端存储 → 后续请求校验
(2)Session/Cookie对比
| 维度 | Session | Cookie |
|---|
| 存储位置 | 服务端(Redis/内存) | 客户端(磁盘/内存) |
| 存储内容 | 复杂对象 | 字符串(≤4KB) |
| 安全性 | 高(服务端存储) | 低(易篡改) |
| 有效期 | 服务端控制 | 客户端持久化 |
(3)分布式会话共享
核心方案:Redis存储SessionID-用户信息映射
1. 登录成功 → 生成SessionID → 存入Redis(设置过期)→ 写入客户端Cookie 2. 跨服务器请求 → 读取Cookie中SessionID → 从Redis获取用户信息 → 校验身份
六、容器与K8s
1. K8s Service核心
| 类型 | 访问范围 | 核心用途 |
|---|
| ClusterIP | 集群内 | 服务间通信 |
| NodePort | 集群外 | 简单外部访问 |
| LoadBalancer | 集群外 | 生产环境高可用 |
| ExternalName | 集群内 | 访问外部服务 |
2. 容器启动流程
(1)Docker启动
# 拉取镜像 → 创建容器 → 启动进程docker pull nginx:1.25 docker run -d -p8080:80 --name nginx nginx:1.25
(2)K8s启动Pod
核心配置示例
apiVersion:v1kind:Podmetadata:name:nginx-podspec:containers:-name:nginximage:nginx:1.25ports:-containerPort:80resources:limits:cpu:0.5memory:512Mi