-
goroutine泄露典型表现为内存持续上涨、pprof显示大量runtime.gopark状态goroutine、HTTP响应变慢但CPU不高;主因是未监听ctx.Done()导致goroutine卡在select或time.Sleep中无法退出。
-
应使用http.Request.FormFile解析multipart/form-data上传文件,避免手动读取body;服务端须校验Content-Type、文件头魔数及大小,ParseMultipartForm需提前设置。
-
Go语言通过libbpf-go或gobpf库在用户态加载和管理eBPF程序,利用其并发、静态编译和系统编程优势,实现高性能、易部署的eBPF工具开发,但需依赖C编写内核态代码,且Go绑定库在部分特性支持上仍有局限。
-
sync.Mutex需显式加锁解锁,推荐defer确保释放;RWMutex适用于读多写少场景;零值可用但禁止复制已使用Mutex;竞态检测不能替代正确并发设计。
-
连接池通过复用数据库连接减少开销,提升吞吐量与稳定性,Go的database/sql内置连接池管理;缓存策略以空间换时间,加速数据访问,常用Redis实现Cache-Aside模式,结合TTL与主动失效保证一致性;两者结合需防范缓存雪崩、穿透、击穿及连接池配置不当等问题,最佳实践包括监控、分层缓存、精细化粒度和容错机制。
-
应使用sync.Mutex避免并发写入冲突,统一用os.WriteFile并配合os.MkdirAll、os.Chmod0600;开发用json.MarshalIndent,生产用json.Marshal;备份路径优先读取XDG_CACHE_HOME;恢复时须用os.IsNotExist判断文件缺失。
-
本文详解Go应用中防范SQL注入的核心实践:禁用字符串拼接构造查询,全面采用参数化查询(PreparedStatements),并结合sqlx等成熟库实现类型安全、可维护的数据库操作。
-
Viper默认不支持远程配置拉取,因其设计为本地优先,AddRemoteProvider仅为预留接口,需手动集成etcd/consulclient并注册provider;ReadRemoteConfig报错“UnsupportedRemoteProvider”即因未注册或初始化client;etcd最简可用需用clientv3.New创建客户端、AddRemoteProvider注册、SetRemoteProvider指定全路径key、再ReadRemoteConfig;Viper无内置热更新,Watch
-
sync.Map适合读多写少场景的数据,如配置缓存、连接池元信息、用户会话状态快照;不适合高频增删改的实时聚合类数据。
-
Go语言通过接口、组合和高阶函数实现装饰器模式:定义统一接口(如Logger),用结构体嵌入原对象并实现相同接口以叠加行为,支持链式调用与类型安全。
-
优先选原生gRPC而非go-micro:gRPC性能高、跨语言强、控制透明,go-microv4虽基于gRPC但抽象过重易调试困难;新项目应从.proto定义、手写Server/Client起步,结合Consul等真实注册中心与自定义resolver实现服务发现。
-
Go用elastic客户端发聚合请求需手动构造aggsJSON结构,必须注意字段名、嵌套层级、.keyword后缀、类型断言安全、size与execution_hint优化及time_zone一致性。
-
应自定义http.Client并设超时(如10秒),配Transport复用连接;JSON解析用json.RawMessage延迟处理、字段名加json标签、非必填字段用指针;命令行用flag即可;本地缓存查词结果至UserCacheDir,以哈希命名、7天过期。
-
Go中Registry模式需显式注册,用包级变量(如带锁map)管理插件,推荐init函数内注册、泛型约束类型安全、避免热加载而采用运行时替换。
-
Gomap扩容时会新建2倍大小的bucket数组并渐进式迁移数据,导致写操作延迟抖动和内存短暂翻倍;可通过延迟抖动、HeapInuse突增或pprof中evacuate调用识别;预分配hint可避免早期扩容。