RSS
菜单
社区成员个人主页
阿成员
DEV CN / 成员主页

阿青 · 社区话题账号

查看阿青 · 社区话题账号发布的技术文章、关注圈子与公开讨论。

0技术文章4关注圈子468圈内发布1关注者
COMMUNITY POSTS

交流圈发布内容

作者在不同技术圈子中的观点与讨论

1
# Golang

Go 逃逸分析是什么?如何查看并减少堆分配

编译期分析变量在函数返回后是否仍被引用(是否逃逸出函数作用域)。逃逸到堆:变量分配在堆上,需 GC 管理;不逃逸:分配在栈上,函数返回自动释放,开销极小。常见逃逸场景:① 返回局部变量指针;② 闭包捕获外部变量;③ 变量存入 interface{}(装箱);④ 全局变量引用;⑤ 大对象(编译器阈值)。优化:避免不必要的指针返回、减少 interface 装箱、复用对象。查看逃逸:go build -gcflags=-m 输出分析结果。

2
# Golang

Go 三色标记法详解:并发标记如何保证不漏标不错标

三色标记:所有对象初始为白色;从根对象开始标记为灰色;循环:从灰色队列取对象,将其引用的对象标记为灰色、自身标记为黑色,直到灰色队列为空;最后白色对象为不可达,可回收。并发标记的问题:标记期间用户代码可能修改引用关系(黑色对象指向白色对象),导致漏标(误回收)。解决:写屏障——并发标记时,黑色对象写入白色指针会记录/置灰该对象(Go 用混合写屏障),保证标记正确性。

3
# Golang

Go 垃圾回收原理:并发三色标记-清除与 STW 优化

Go 采用并发三色标记-清除(mark-sweep)垃圾回收:① 标记阶段:从根对象(全局变量、栈、寄存器)出发,用三色标记(白=未访问、灰=待处理、黑=已处理)追踪可达对象;② 清除阶段:回收不可达(白色)对象的内存。并发优化:标记与用户代码并发执行(写屏障保证正确性),STW(Stop The World)时间极短(毫秒级),1.5+ 后大幅改善,1.8+ 引入混合写屏障进一步降低停顿。触发时机:堆增长到 GOGC 阈值、手动 ru…

4
# Golang

Go errgroup 怎么用?并发任务错误收集与取消传播

golang.org/x/sync/errgroup:并发执行多个任务并收集第一个错误。用法:g, ctx := errgroup.WithContext(ctx); g.Go(func() error {...}); err := g.Wait()。特点:① 任一任务返回错误会取消 ctx(WithContext 时),其他任务可监听 ctx.Done() 退出;② Wait 返回第一个非 nil 错误;③ SetLimit 限制并发…

5
# Golang

Go 并发控制方案:信号量、worker pool 与限流怎么选

方法:① 带缓冲 channel 做信号量:sem := make(chan struct{}, N),执行前 sem <- struct{}{},结束 <-sem 释放——限制最大并发数;② worker pool:固定 N 个 goroutine 从任务 channel 取任务(for job := range jobs),任务多时排队;③ errgroup.SetLimit(N) 限制并发且收集错误;④ golang.org/x/…

6
# Golang

Go channel 死锁场景盘点:如何快速定位与避免

死锁:所有 goroutine 都阻塞且无法解除,运行时报 fatal error: all goroutines are asleep - deadlock!。常见:① 无缓冲 channel 只发不收或只收不发;② 主 goroutine 阻塞等子 goroutine,子 goroutine 又在等主 goroutine 数据;③ 忘记 close 导致 range 永不退出(不算死锁但泄漏);④ 锁 + channel 混用循环等…

7
# Golang

Go goroutine 泄漏如何避免?5 种泄漏场景与排查方法

泄漏场景:① goroutine 阻塞在 channel 收发(无配对);② 死循环未监听退出信号;③ time.Timer 未 Stop;④ 数据库/HTTP 连接未关闭。避免方法:① 用 context 取消:goroutine 内 select 监听 ctx.Done();② 超时控制:带超时的 select 或 WithTimeout;③ 生产者关闭 channel 通知退出(for range ch 自动退出);④ errgr…

8
# Golang

Go context 详解:取消传播、超时控制与请求级值传递

context 用于传递取消信号、超时/截止时间、请求级值。创建:context.Background()(根)、context.TODO();派生:WithCancel、WithTimeout、WithDeadline、WithValue。取消传播:父 ctx 取消(或超时)→ 所有子 ctx 的 Done() 关闭 → 监听方退出。规范:ctx 作为函数第一个参数传递;监听 ctx.Done() 做清理;WithValue 只存请求…

9
# Golang

Go sync.Once 怎么用?并发安全的单例初始化实现

sync.Once 保证某个函数只执行一次(并发安全),用于单例初始化、懒加载配置、只注册一次的全局操作:var once sync.Once; once.Do(func() { initSomething() })。即使多个 goroutine 同时调用 Do,函数也只执行一次,其他 goroutine 等待完成。内部实现:原子标志 + Mutex + 双重检查。注意:Once 不可复制;Do 内函数 panic 后 once 状态仍…

10
# Golang

Go sync.Map 详解:适用场景、性能对比与 API 用法

sync.Map 是并发安全 map,内部用读写分离(原子读 map + 脏 map + miss 计数)优化。适用场景:① 读多写少且 key 稳定;② 不同 goroutine 操作不同 key(避免锁竞争);③ 只增不减的场景。不适用:频繁写/删除(性能可能低于 Mutex+map)。API:Load、Store、LoadOrStore、Delete、Range(遍历回调)。注意:Range 遍历顺序随机;无 Len 方法(需 R…