Go问答技术文章
-
Golang · Go问答 | 3星期前 | go · Go File.WriteAt 并发写 Go 文件分片写入 Go os.File 并发安全 Go WriterAt 不重叠区间 Go O_APPEND WriteAt
Go 的 os.File 可以被多个 goroutine 并发调用,但 File.WriteAt 是否安全取决于写入区间、打开模式、缓冲区生命周期和错误处理。本文用分片写入示例说明可行边界。307 收藏 -
Go HTTP 客户端请求成功后,Response.Body 需要正确读取和关闭,否则 Transport 可能无法复用 keep-alive 连接。本文用代码和排查表说明未关闭、未读完、提前返回及 Client 复用的处理边界。307 收藏 -
Go os.ReadDir 的排序不是文件系统偶然表现,而是包级函数明确提供的稳定契约。本文拆解源码并对比 os.File.ReadDir 的目录顺序,帮助你选对读取方式。307 收藏 -
通过 LookupHost 的独立 context 和 Resolver.Dial 的 Dialer 超时,分层限制 Go DNS 解析总时限与单次连接等待。306 收藏 -
Go os.Root 会跟随根目录内的软链接,但每次打开仍会校验最终目标是否留在边界内。本文用三类链接、错误分类与安全代码解释为什么边界错误是预期防护。306 收藏 -
context.WithoutCancel 会保留父级值访问,却主动切断 Deadline、Done、Err 和 Cause。本文用最小示例说明原因,并给出后台任务重新建立独立超时的写法。305 收藏 -
遍历结构体切片时,range 值变量会复制每个元素。本文用最小示例说明复制边界,并给出索引访问、取地址和基准测试的选择方法。305 收藏 -
Golang · Go问答 | 6天前 | Context · 超时控制 · net/http · Go问答 · Go HTTP超时 context.WithTimeout http.Client.Timeout
Go 的 http.Client.Timeout 是同一客户端所有请求共享的总时限兜底,请求 Context 则是单次调用可继承、可手动取消的业务预算。两者都能覆盖连接到响应体读取的完整生命周期,同时配置时更早的截止时间生效。304 收藏 -
Go 的 netip.Addr.Unmap 只会移除 IPv4-mapped IPv6 的映射前缀。本文用 Is4In6、Is4、As4 和 BitLen 说明何时需要规范化地址、何时应保留 IPv6 语义,并给出统一比较和序列化时的判断清单。304 收藏 -
Go base64.NewEncoder 会缓存不足三个字节的尾部数据。本文按输入长度余数说明忘记 Close 时标准 Base64 会少掉多少字符,并给出显式 Close、错误检查和边界回归测试的修复方法。303 收藏 -
bytes.CutPrefix 未匹配前缀时会返回原始切片和 false,返回值依然有效且不产生副本。本文说明底层数组共享、修改风险、空前缀及 bytes.Clone 的使用边界。303 收藏 -
Go 的 C 回调不能直接把函数值当作 C 函数指针传递。本文用导出函数、C 网关和 runtime/cgo.Handle 说明如何保持回调引用,并按同步、异步和并发注销场景判断安全释放时机。301 收藏 -
FieldsPerRecord 设为 0 不是关闭校验,而是让 encoding/csv 用第一条记录的字段数作为后续标准,因此列数变化仍会返回 ErrFieldCount。真正允许变长记录应设为负数;引号等 CSV 语法错误则不会被该设置忽略。301 收藏 -
errors.Is 只在第一个参数的错误树上匹配:比较当前节点、调用当前节点的 Is(target),再展开子错误。本文解释为何目标值的 Is 不会被反向调用,并给出正确的自定义匹配方式。301 收藏 -
Go 的 httptest.ResponseRecorder.Code 为 0 不一定代表接口返回了 0。处理器没有显式写状态或响应体时,应在执行结束后调用 Result().StatusCode 读取隐含的 200,并理解 Code、HeaderMap 与 Result 的边界。300 收藏