Go语言技术文章
-
Go GC pacer 变慢不一定是内存泄漏:用 gctrace、运行时指标和 CPU profile 对照回收后存活堆与 GC 工作量,区分堆增长和 CPU 压力,再决定改分配路径还是调参数。161 收藏 -
Go 用 unsafe.String 把可变字节缓冲区借用成字符串后,如果原切片被复用、写入或提前失去生命周期约束,字符串读取时就可能偶发乱码。本文按触发条件定位原因,并给出安全的复制写法。158 收藏 -
Golang · Go教程 | 3天前 | Go教程 · Go slog JSONHandler时间格式 HandlerOptions ReplaceAttr slog.TimeKey Go结构化日志时区 time.Time Format
Go log/slog 的 JSONHandler 没有直接的时间布局参数,本文用 HandlerOptions.ReplaceAttr 重建 time 属性,讲清 Go 时间布局、UTC、分组字段和零时间的处理边界。158 收藏 -
Go 的 exec.Cmd.WaitDelay 不只是进程超时参数,它还限制子进程退出后 stdout/stderr 管道迟迟不关闭的等待时间。本文说明计时起点、ErrWaitDelay 与 ExitError 的区别,以及如何安全判断返回值。157 收藏 -
reflect.Value.IsZero 判断的是值所属类型的 Go 零值,不等同于字段为空、结构体没有可见内容或切片长度为零。本文用结构体、空集合和无效 Value 的对比示例说明边界,并给出更合适的判断选择。156 收藏 -
Go race 报告没有栈信息时,先区分没有触发竞态、历史栈恢复失败和日志截断,再用 go test 的 -run、-count、-cpu 与 GORACE 的 history_size、log_path 提高复现和定位效率。156 收藏 -
在 Go 的 cgo 代码里,C.GoString 适合读取以 NUL 结尾的 char*,C.GoStringN 适合长度明确的数据;反向使用 C.CString 时还要释放 C 堆内存。本文用一个小示例把三种边界讲清楚。155 收藏 -
Go 的 sql.Stmt 可以被多个 goroutine 并发使用,但 Close 不等于取消查询。本文说明正在执行、Rows 返回后和优雅停机时的正确关闭顺序。155 收藏 -
使用一个 Go log.Logger 统一格式,再通过 io.MultiWriter 同时写入标准输出和文件;本文还说明写入错误短路、并发安全与 Close 生命周期边界。154 收藏 -
讲清 bytes.Buffer 处理分段响应时 Len、Cap、Grow、Reset 和 Bytes 的边界,给出复用同一缓冲区、复制别名数据和隔离并发请求的实战写法。154 收藏 -
Go atomic.Pointer 的零值就是 nil。本文用启动 Store 和懒初始化 CAS 两种方案,说明如何把 nil 定义为未初始化状态,避免空指针解引用、重复初始化和对象字段数据竞争。153 收藏 -
Go 的 type assertion 失败可能来自 nil 接口或动态类型不匹配,携带 nil 指针的接口又是另一种状态。本文用 comma-ok、nil 判断和类型 switch 说明如何安全区分并处理这三类输入。152 收藏 -
Go 的 context.WithDeadline 只能把子 context 的截止时间收紧,不能延长父请求预算。本文说明 Done、Err、cancel 如何传播,以及为什么取消不会强行终止未监听 context 的 goroutine。152 收藏 -
Go 中使用 bufio.Reader.Peek 查看协议头或下一行前缀而不推进读取位置,本文说明逐步探测、切片复制、长行和 ErrBufferFull 的处理边界。150 收藏 -
Go HTTP 请求取消后,Transport 如何处理连接、请求体、响应体和错误?本文按 RoundTrip 的实际边界解释 context.Canceled、超时与连接复用。150 收藏