Go问答技术文章
-
Go 的 Request.WriteProxy 面向 HTTP 代理写出请求,会在请求行使用包含 scheme 和 host 的绝对 URI;本文区分 Write、WriteProxy、URL 与 RequestURI,给出代理调试时的排查思路。449 收藏 -
解释 goavro NativeFromBinary 返回剩余字节的含义,区分单条 datum、连续记录、传输帧和 OCF 容器,并给出生产排障与边界检查方式。449 收藏 -
Go 项目出现 vendor inconsistent dependencies 时,通常是 go.mod 已变更而 vendor/modules.txt 仍是旧清单。本文按模块图、go mod vendor 和离线构建三个边界,给出恢复一致的排查顺序。449 收藏 -
unsafe.StringData 可以让 Go 程序拿到字符串底层字节的指针,但这不等于获得了一块可长期持有、可修改的内存。本文用可运行的小实验区分指针有效期、字符串生命周期和只读边界,给出适合零拷贝场景的使用检查。448 收藏 -
Go replace 指向本地目录后 CI 找不到依赖,通常是替换路径在干净 runner 中不可见。本文用相对路径、go.work 和可访问模块三种方案说明如何修复,并给出提交前的反向检查。448 收藏 -
解释 Go go:linkname 与普通 import 的区别,定位 Go 1.23 标准库内部符号链接失败的原因,并给出公开 API、handshake 与最小验证建议。448 收藏 -
围绕 Go database/sql Tx 讲清异常路径统一回滚的写法:用 defer 兜底、事务内统一使用 Tx、正确处理 Commit 错误,并给出资源释放检查清单。448 收藏 -
Go 使用 os.File 更新配置或状态文件时,先在同目录临时文件中完整写入并 Sync,再关闭文件并 Rename,既避免半文件,也能清楚区分原子替换与断电持久化边界。448 收藏 -
weak.Pointer 不会让对象保持可达,但 map 中的弱键不会自动删除。本文用 Go 示例说明如何依据 Value() 返回 nil 清理失效键,并处理并发、保活和惰性扫描边界。448 收藏 -
Go net/http 中,响应 Trailer 不是普通响应头,服务端要在写出响应前声明尾部字段,客户端还要先把 Response.Body 读到 EOF 才能读取最终 Trailer。本文解释声明顺序、读取时机与为空排查方法。448 收藏 -
结构体里放入 sync.Mutex 后,按值传参、赋值或返回都会复制锁的内部状态,可能造成异常解锁、数据竞争和锁失去保护对象。本文从根因、错误写法、指针改造和 go vet copylocks 检查四个方面说明安全设计方式。448 收藏 -
WaitGroup 只等待对应任务计数归零,不自动等待消费者或刷新缓冲。文章区分 Add 过晚、Done 过早、异步写入遗漏与 Flush 边界,给出独立结果槽和生产消费两种同步方案。448 收藏 -
Go CommandContext 默认只取消 Cmd 对应的直接进程,shell 派生的孙进程和仍持有 stdout/stderr 的 I/O 管道可能让 Wait 继续等待。本文解释取消边界、进程树与管道回收,并给出直接执行、进程组和 WaitDelay 的选择方法。448 收藏 -
Go 闭包捕获循环变量是否出错,取决于模块版本和变量声明方式。本文用最小示例解释 Go 1.22 的按迭代语义、Go 1.21 的 loopvar 预览方式,并给出兼容旧版本的修正写法。448 收藏 -
Go 程序放进容器后,runtime.GOMAXPROCS 返回的并发上限和宿主机核数不一定相同。本文用运行时探针区分逻辑核、CPU 配额与调度上限,解释容器内核数判断的边界,并给出可复现的检查代码。447 收藏