Go问答技术文章
-
Go 通过 cgo.Handle 把 Go 值暂存给 C 侧时,关键不是把指针强行塞过去,而是明确句柄的创建、回调取值和 Delete 释放边界。本文用一个回调桥接例子说明生命周期、并发与异常清理。308 收藏 -
Golang · Go问答 | 1个月前 | GC · sync.Pool · bytes.Buffer · 内存优化 · Go问答 · Go 垃圾回收 内存占用 对象池 sync.Pool bytes.Buffer buffer复用
Go 服务用 sync.Pool 复用 bytes.Buffer 后,流量回落时 RSS 仍高并不一定是泄漏。本文从大容量底层数组被放回池、GC 回收节奏和运行时向系统归还内存三个层面复现问题,给出容量上限与 pprof 验证方法。307 收藏 -
用 runtime/trace.NewTask 给跨 goroutine 的业务操作建立可追踪边界,说明 context.Context 如何传播任务、task.End 如何收口,以及 trace.WithRegion 与 go tool trace 的分工。307 收藏 -
Go 的 Header.Get 找不到请求头和找到空值时都可能返回空字符串。本文用 Header.Set、Header.Get、Header.Values 和 CanonicalMIMEHeaderKey 拆开这个边界,给出缺失判断、重复值读取与大小写处理的可运行写法。306 收藏 -
Golang · Go问答 | 2个月前 | JSON · 接口设计 · Go问答 · nil slice · Go 接口兼容 json.Marshal nil slice empty slice 数组字段
回答 Go nil slice 和空 slice 在 JSON 输出上的差异,说明为什么一个是 null、一个是 [],并给出接口数组字段统一成 [] 的代码写法、回归检查和迁移清单。305 收藏 -
strings.Cut 把字符串拆分成 before、after 和 found 三个结果,适合处理带前缀的配置、路由和协议字段。本文用可运行示例说明空字符串边界、与 HasPrefix 的分工,以及从 Index 写法迁移时的验收方式。305 收藏 -
Golang · Go问答 | 1个月前 | goroutine · Context · Go问答 · 排查清单 · 服务超时 · goroutine泄漏 context.WithTimeout Go问答 CancelFunc Go context取消 Go服务超时
Go 服务已经返回超时,但后台 goroutine 仍在消耗连接和内存,往往不是超时参数太小,而是取消信号没有沿调用链传递或 CancelFunc 没有及时调用。本文给出从症状判断、代码修复到告警复盘的排查清单。304 收藏 -
Go log/slog 的 HandlerEnabled 适合把动态级别判断前移。本文用 LevelVar 和请求级过滤示例,拆开日志级别、属性改写与上下文边界。304 收藏 -
Golang · Go问答 | 1个月前 | interface · 测试 · 架构设计 · Go问答 · 代码评审 · Go 接口设计 接口定义位置 Go mock accept interfaces return structs Go 架构
Go 接口通常应放在使用方包里,而不是实现方为了 mock 提前导出一大组接口。本文通过调用方依赖、真实测试与多实现边界,说明什么时候该定义小接口,什么时候直接返回具体类型更清晰。300 收藏 -
用 Go 1.23 新增的 os.CopyFS 把 embed.FS 复制到本地目录,说明目标目录创建、已有文件冲突、fs.ErrExist 判断和权限边界。299 收藏 -
Go 1.27 对 go.mod 的多组 require 块做了结构整理。本文从合并冲突和手工编辑后的现场出发,解释何时会重排、注释如何归属,以及升级后怎样做最小复查。298 收藏 -
Golang · Go问答 | 4天前 | 字符串 · 内存 · go · 性能 · strings.Builder · 字符串拼接 reset() String() 内存复用 go strings.Builder WriteString
strings.Builder 适合顺序拼接字符串,但 String() 返回值与 Builder 的后续写入、Reset() 复用之间有明确边界。本文用可运行实验说明结果何时可以长期保存,以及为什么不能复制 Builder。297 收藏 -
Golang · Go问答 | 4天前 | 流式处理 · 工程实践 · net/http · Go问答 · HTTP服务器 · Go HTTP服务器 请求体 流式请求 EnableFullDuplex http.ResponseController
http.ResponseController.EnableFullDuplex 解决的是 HTTP 服务端同时读取请求体和写出响应的边界问题。本文用一个边读边回传的 Go Handler 拆开它的默认行为、启用时机、协议限制和测试检查点,说明什么时候该用,什么时候不该把它当成通用加速开关。296 收藏 -
Go 的 map 可以在 range 遍历中删除当前键,但删除未到达的键会改变本轮可见结果,新增键则可能出现也可能被跳过。本文用可运行示例拆开这三个边界,并说明并发场景为什么仍然不安全。295 收藏 -
signal.NotifyContext 让操作在收到系统信号时通过 ctx.Done 退出,但取消上下文与停止信号订阅是两件事。理解 stop 的资源释放和默认信号行为,才能写出可重复启动、可测试的优雅退出代码。295 收藏