Go语言技术文章
-
Go 闭包捕获循环变量是否出错,取决于模块版本和变量声明方式。本文用最小示例解释 Go 1.22 的按迭代语义、Go 1.21 的 loopvar 预览方式,并给出兼容旧版本的修正写法。448 收藏 -
用 Go iter.Pull2 消费分页 Seq2 时,空页应让生成器自然结束,消费者提前退出则必须调用 stop。本文给出 next、stop 和 defer 的组合写法,并说明空页死循环与并发调用边界。448 收藏 -
Go tls.Conn.HandshakeContext 被取消后,不应只看 context 错误就继续复用连接。本文结合 HandshakeComplete 拆清握手取消、底层连接关闭和安全回收边界。448 收藏 -
Go log/slog 不会替业务字段自动排序。本文用固定属性切片、动态键排序、With 与 Group 的边界,说明怎样让 TextHandler 和 JSONHandler 的日志字段保持可预测顺序。448 收藏 -
Go 的 flag 包默认使用全局 CommandLine。本文用 NewFlagSet 拆出独立参数集合,说明 ContinueOnError 的错误返回、输出重定向和每个子命令独立解析的写法,避免重复注册和解析失败直接退出。448 收藏 -
net/http.Transport 的 IdleConnTimeout 过短时,空闲 keep-alive 连接会提前离开连接池,后续请求更容易重新建连。本文用 httptrace 区分连接复用与新建连接,并给出参数边界、排查顺序和调整方法。448 收藏 -
数据竞争本身足以让 Go race 测试失败,但报告不自动证明某条业务断言的因果。本文区分两类证据,说明冲突栈定位、同步示例与 TestMain 后台任务边界。448 收藏 -
Go os.File.ReadAt 读取固定偏移时,n 小于 len(buf) 就不能当作成功。本文按文件剩余长度解释短读、io.EOF 与其他错误的关系,并给出严格读取固定片段的封装写法。448 收藏 -
Go 的 go build -tags 支持以逗号分隔的方式指定多个构建标签(如 -tags=dev,sqlite,debug),从而精确控制哪些带 // +build 或 //go:build 约束的源文件参与编译;空格分隔方式已被弃用。 Go 的 `go build -tags` 支持以逗号分隔447 收藏 -
Golang · Go教程 | 2个月前 | goroutine · pprof · Go教程 · 运行时 · Go label runtime/pprof Do ForLabels goroutine 归因
线上 CPU profile 只能告诉你哪里忙,却不一定能说明是哪类任务在忙。本文用 runtime/pprof 的 Label、Do、ForLabels 和 SetGoroutineLabels 给请求打上可检索的任务标签,并说明标签继承、覆盖、读取和采样查看的边界。447 收藏 -
Go 程序放进容器后,runtime.GOMAXPROCS 返回的并发上限和宿主机核数不一定相同。本文用运行时探针区分逻辑核、CPU 配额与调度上限,解释容器内核数判断的边界,并给出可复现的检查代码。447 收藏 -
高频日志过滤不要在每条日志到来时重新解析正则。本文用一个小型过滤器演示 regexp.Compile 的初始化时机、*regexp.Regexp 的并发复用,以及动态改规则时如何隔离可变配置。447 收藏 -
Go 泛型约束里的 int 只匹配具体类型,~int 匹配底层类型为 int 的命名类型。本文用 type Score int、类型别名和泛型函数说明两者的选择边界。447 收藏 -
Go 用 io.CopyN 从网络连接复制固定块时,完整条件不是只看错误是否为空;本文说明如何设置 SetReadDeadline,结合 written、io.EOF 和 os.ErrDeadlineExceeded 处理半包、总时限与空闲超时。447 收藏 -
对比 Go strings.CutPrefix 与 strings.TrimPrefix 的返回值和适用场景,说明何时需要 found 判断、何时只需得到去掉前缀后的字符串,并补充空前缀、大小写和旧版本兼容边界。447 收藏