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

阿青 · 社区话题账号

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

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

交流圈发布内容

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

1
# Golang

Go fmt 格式化动词全表:%v、%T、%d、%q 怎么用

常用动词:%v 默认格式、%+v 带字段名(结构体)、%#v Go 语法表示、%T 类型、%d 十进制整数、%f 浮点、%.2f 保留两位、%s 字符串、%q 带引号字符串、%x 十六进制、%t 布尔、%p 指针。宽度/精度:%5d 右对齐宽 5、%-5d 左对齐、%06d 前导零。注意:fmt.Sprintf 返回字符串、fmt.Errorf 返回错误(%w 包装);Println 自动加空格换行;性能敏感场景用 strconv 或…

2
# Golang

Go 零拷贝是什么?切片共享与 unsafe 转换的实现方式

零拷贝指数据在传输/转换时避免复制,直接引用原内存。Go 中的场景:① 切片共享底层数组(s2 := s1[1:] 不复制);② string 与 []byte 零拷贝转换(unsafe.Pointer 转换,绕过复制,风险高需保证只读);③ io.Reader 直接读写用户 buffer(io.CopyBuffer);④ sendfile/splice 等系统调用(网络发送文件)。安全零拷贝优先用切片共享;unsafe 转换只读场景谨…

3
# Golang

Go 性能优化:如何减少 GC 压力?7 个实战技巧

核心:减少堆分配次数和总量。手段:① 对象复用(sync.Pool、全局 buffer);② 避免逃逸(小对象传值、避免返回指针);③ 预分配容量(make([]T, 0, n) 避免多次扩容;map 预估容量);④ 用 strings.Builder 替代字符串 + 拼接;⑤ 减少 interface{} 装箱(保持具体类型);⑥ 局部变量作用域最小化(帮助栈分配);⑦ 用 -gcflags=-m 检查逃逸;⑧ 适当调大 GOGC 换…

4
# Golang

Go sync.Pool 对象池:如何复用对象减少 GC 压力

sync.Pool 对象池:缓存临时对象复用,减少堆分配和 GC 压力。用法:var pool = sync.Pool{ New: func() interface{} { return &Buffer{} } };获取 obj := pool.Get().(*Buffer);用完 pool.Put(obj) 放回。特性:① 池内对象可能被 GC 随时清空(无强引用),New 保证取不到时有兜底;② 适用于创建昂贵、使用频繁的对象(大…

5
# Golang

Go 内存对齐原理:struct 字段顺序如何影响内存占用

CPU 按字长(64 位 8 字节)访问内存,变量地址需对齐到其自然对齐边界(int64→8、int32→4),否则部分平台报错或性能下降。Go 结构体字段按声明顺序对齐,会有 padding(填充字节):struct { a int8; b int64 } 占 16 字节(a 后补 7 字节);调整字段顺序可减小结构体大小:struct { b int64; a int8 } 占 16(a 后补 7)→ 实际 struct{a int…

6
# Golang

Go GC 参数调优:GOGC 与 GOMEMLIMIT 怎么配才合理

GOGC(默认 100):目标堆大小为上次 GC 后存活堆的 200%(1+GOGC),即堆翻倍触发 GC;调大(200/400)→ GC 频率低、内存峰值高、吞吐好;调小 → GC 频繁、内存平稳、延迟略增。GOMEMLIMIT(Go 1.19+):设置内存软上限(如 4GiB),配合 GC 自动调整频率避免超限 OOM,容器环境建议设置为限制的 80-90%。组合使用:GOGC=off + GOMEMLIMIT 让 GC 完全按内存…

7
# Golang

Go pprof 性能分析实战:CPU、内存、goroutine 三个维度

接入:import _ "net/http/pprof",启动 HTTP 服务后访问端点:/debug/pprof/(概览)、profile(CPU 30s)、heap(内存)、goroutine(协程)、allocs(分配)、block(阻塞)。命令行分析:go tool pprof http://localhost:6060/debug/pprof/heap 进入交互(top 排序、list 看源码行、traces 调用链、web…

8
# Golang

Go 内存泄漏典型场景盘点与 pprof 排查方案

① goroutine 泄漏:channel 阻塞无配对、死循环未退出——goroutine 栈永远不释放;② 未关闭资源:http.Response.Body 未 Close、文件句柄、DB 连接、time.Ticker 未 Stop;③ 全局缓存无限增长:map/slice 只增不减、缓存无淘汰策略;④ 闭包意外持有大对象:长生命周期对象被短生命周期引用链保留;⑤ 未解除的引用:切片切片后保留原大数组(s := big[0:1] 仍…

9
# Golang

Go 堆与栈的区别?如何让变量分配在栈上提升性能

栈:每个 goroutine 独立(初始 2-4KB 可增长),后进先出,存储局部变量、函数调用帧;分配释放快(移动指针)、无需 GC、缓存友好;容量有限,大对象不适合。堆:全局共享,存储逃逸对象、动态分配的大对象;分配较慢(涉及锁/GC)、需要垃圾回收。Go 开发者不直接控制(无 new 分配位置选择),由逃逸分析决定。性能优化核心之一:减少堆分配(对象复用、值传递、避免逃逸)。

10
# Golang

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

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