Go语言技术文章
-
Go 判断 IP 是否为回环地址时,优先把文本解析为 netip.Addr,再调用 IsLoopback。本文区分 IPv4、IPv6、映射地址、未指定地址和零值 Addr 的边界。209 收藏 -
用 github.com/google/uuid 处理 UUID 字符串时,外部输入应使用 Parse 并保留 error,固定可信常量才使用 MustParse,统一输出交给 String;严格 API 外形还要额外约束。230 收藏 -
Go 1.27 的 bytes.CutLast 可以按最后一次分隔符拆分字节切片。本文说明它与 Cut、LastIndex 的区别、未找到和空分隔符边界,以及返回原切片视图时何时需要 Clone。457 收藏 -
Go test -failfast 会在首个测试失败后停止启动新的测试,但不会把已经开始的并行测试瞬间杀掉。本文按串行、并行、清理和 CI 门禁的边界,说明如何用它快速定位失败。343 收藏 -
Go GC 参数改动后延迟升高,通常不是“GOGC 越小越快”这么简单。本文从 GC 周期、分配速率、GC assist 与软内存上限入手,给出最小复现、指标判断和单变量修正方法。333 收藏 -
runtime.ReadMemStats 统计的是 Go 运行时的分配与保留情况,不等于操作系统看到的进程 RSS。本文用字段对照和 Linux 最小采集示例说明差异来源与排查路径。423 收藏 -
Go trace 和 pprof 的先后取决于症状:CPU 与内存热点先看对应 profile,低 CPU 高延迟和调度问题看短窗口 trace。本文给出选择表、原创编码基准和独立采集命令,说明口径与开销边界。179 收藏 -
解释 Go slog JSONHandler 遇到不可序列化值时为什么输出 !ERROR:json,并给出稳定摘要与 LogValuer 修正方式。470 收藏 -
解释 time.Timer.Stop 返回 false 在 NewTimer 与 AfterFunc 中的不同含义,区分 Go 1.23 同步计时器通道与旧语义,并给出避免重复处理到期事件的收尾方式。246 收藏 -
Go 服务器调用 Shutdown 后仍可能因主协程提前退出、排空上下文已取消或外部期限到达而截断请求。通过原创服务示例拆解退出顺序、超时强制关闭和依赖收尾。451 收藏 -
Go select 中多个 case 同时就绪时,不按源码顺序固定选择,而是在可继续的通信中做均匀伪随机选择。本文说明怎样识别最终分支、区分表达式求值与通信执行,并处理 default、nil 和 closed channel 的边界。375 收藏 -
Go channel 缓冲区只能吸收暂时的速率差,不能提升消费者吞吐量。本文从到达速率、消费速率、发送阻塞和队列积压出发,说明如何选择一个小而有界的容量,并给出观察代码与决策表。427 收藏 -
Go http.Request FormValue 会隐式解析表单并忽略错误,导致空字符串掩盖正文损坏或字段缺失。本文给出 ParseForm、ParseMultipartForm、PostForm 与错误校验的清晰边界。129 收藏 -
Go net.Buffers.WriteTo 返回的 n 可能小于总字节数。本文从官方实现的消费语义出发,说明如何记录基线、区分合法错误与违反 io.Writer 契约的短写,并安全处理剩余数据。196 收藏 -
把 sync.WaitGroup.Add 放进新 goroutine,可能让 Wait 提前返回,也可能触发计数为负或 Add 与 Wait 并发的运行时 panic。本文用最小结构说明计数边界、批量任务写法和 go vet 检查方式。325 收藏