-
reflect.Select在循环中频繁调用会导致显著内存与调度开销,因其每次均分配切片并构造reflect.Value,引发GC压力;应避免在tightloop中裸用,优先采用中介channel+转发goroutine等无反射方案。
-
sync.Map在读多写少场景下更慢,因其每次Load需两次原子读且可能fallback到加锁的dirty路径,而原生map+sync.RWMutex读锁开销极低;适用写稀疏、key稳定场景,非极致读性能优化。
-
make(map[string]int)比直接声明慢是因为默认初始桶数为0,后续插入触发多次扩容和rehash;应预估容量显式初始化以减少早期扩容。
-
Go中判断byte是否为0应直接用b==0,因其本质是uint8;避免使用b=='\x00'等冗余写法,且须先确保索引有效以防panic。
-
Go程序调用containerd启动容器变慢的主因是连接复用缺失、镜像未预热、snapshot未复用及冗余配置;亚秒级启动需复用client、预检镜像、显式指定snapshot、禁用非必要cgroup限制;销毁须严格按Stop→Wait→Delete→清理snapshot顺序执行。
-
应直接使用github.com/sony/gobreaker,禁止在外层包装http.Get或cb.Execute;必须实现自定义RoundTripper,在RoundTrip中调用cb.Execute并透传*http.Request和req.Context(),同时按P95耗时设Timeout、按错误类型过滤ReadyToTrip。
-
服务熔断通过自动切断故障依赖防止系统雪崩,gobreaker库以轻量方式实现该机制,支持状态监控与灵活配置,建议结合超时、重试策略及监控体系提升系统稳定性。
-
Go语言中使用compress/gzip包实现文件及内存数据的压缩解压。1.压缩文件:打开源文件,创建.gz目标文件,通过gzip.NewWriter写入并调用Close()完成压缩。2.解压文件:用gzip.NewReader读取.gz文件,io.Copy将解压数据写入新文件。3.内存操作:bytes.Buffer结合gzip.Writer/Reader实现字节流压缩解压,适用于API响应等场景。关键点:Writer必须Close以触发压缩,Reader可直接流式读取,建议封装为通用函数复用。
-
不能直接用rate.NewLimiter做三维度限流,因其无key概念,所有请求共享同一令牌桶;必须为每个IP+用户ID+接口路径组合创建独立limiter实例,并用sync.Map安全存取、定时清理过期项。
-
使用gorilla/websocket实现Go语言WebSocket通信,首先安装依赖并创建升级器处理连接,通过wsHandler处理读写消息,主函数注册路由启动服务;前端用JavaScript建立连接测试;实现广播机制需维护客户端映射表和消息通道,将收到的消息推送给所有连接;生产环境应设置读写超时、使用锁保护共享资源、处理心跳及优雅关闭。掌握这些核心点可构建实时聊天与通知系统。
-
Go的http.Request不自动解析表单,须显式调用ParseForm()或ParseMultipartForm();否则r.Form和r.PostForm为空;r.FormValue("username")失效即因未调用解析方法;ParseForm()适用于普通表单,ParseMultipartForm(maxMemory)用于含文件上传的表单。
-
该用指针传参当结构体较大(字段超4–5个,含[]byte、map、slice等)以减少拷贝开销;小结构体传值更高效;切片、map、chan本身轻量,无需额外加星号;避免不必要的指针导致逃逸和GC压力。
-
GoHTTP服务panic致进程退出的根本原因是Server不捕获handler内panic,导致goroutine崩溃、ListenAndServe异常返回;需用panicHandler包装器统一recover并记录堆栈,配合ErrorLog和Shutdown避免资源泄漏。
-
container/heap/v2尚未进入标准库,因其仍是提案(Goissue#64287),未被合并到任何已发布版本;当前只能使用需指针接收器的旧版,且Push/Pop必须用指针调用。
-
Go事务生效关键在于所有操作必须绑定同一*sql.Tx实例,混用db.Exec()会脱离事务立即提交;GORM中需用tx.Create()而非db.Create();Savepoint需手写SQL;推荐使用db.Transaction()自动管理。