Go语言技术文章
-
围绕 context.AfterFunc 的取消触发、stop 返回值、幂等清理和完成等待,说明它适合哪些超时清理场景,以及为什么不能把 stop 当成同步等待函数。489 收藏 -
Go 的 url.JoinPath 适合在已有 URL 上拼接路径段并清理多余斜杠、点段,同时保留 base 中的查询参数和片段。本文说明路径段转义、错误处理、URL.JoinPath 选择和常见边界。489 收藏 -
Go errors.Join 会忽略真正 nil,全部成功返回 nil。通过可选检查示例解释混合输入、错误成员识别及带类型空指针的返回陷阱,并给出聚合错误的适用约定。489 收藏 -
runtime.KeepAlive 用于让持有原生句柄的 Go 对象在指定位置前保持可达,避免 finalizer 提前关闭资源。本文给出最小写法、放置位置、适用边界与常见误区。489 收藏 -
用 Go os/signal 和 NotifyContext 组织优雅停止:让取消信号传到后台 goroutine,等待资源收尾,并正确释放通知注册,避免服务退出后的 goroutine 泄漏。489 收藏 -
Go 的 File.Sync 只针对已经打开的文件描述符提交数据和文件元数据,临时文件 Rename 后的目录项仍属于父目录。本文拆分三层持久化边界,并给出 Go 的安全替换写法与平台注意事项。489 收藏 -
Go maps.Equal 比较包含 NaN 的映射时返回 false,是因为它按 == 比较值,而 NaN 不等于自身。本文解释值与键的边界,并给出 maps.EqualFunc 的业务比较写法。489 收藏 -
Go 解析 X.509 证书时,未知扩展应从 Certificate.Extensions 读取原始 OID、Critical 和 Value;重新生成证书则使用 ExtraExtensions,并单独处理未知关键扩展。489 收藏 -
Go 切片 append 后另一个切片内容跟着变化,通常是因为容量足够时仍共享底层数组。本文用 len、cap 和最小示例区分共享与扩容分支,并给出 copy 与 slices.Clone 的隔离写法。489 收藏 -
Go 的 http.Client 返回响应后,Response.Body 不读取、不关闭,或每次新建 Client,都可能让 Transport 无法复用持久连接。本文用原创示例拆开 Body 生命周期、读取策略和连接池排查方法。489 收藏 -
Go 用 archive/zip 生成的 ZIP 无法打开时,先检查条目写入、zip.Writer.Close 和底层输出的关闭顺序,再用 zip.Reader 区分截断、写入失败与 CRC 校验问题。489 收藏 -
Go HTTP 客户端用 multipart.Writer 同时上传文件和表单字段时,应使用 WriteField 与 CreateFormFile 写入同一个 body,最后 Close 并复用 FormDataContentType 设置请求头。本文给出完整写法、资源关闭顺序和常见排查点。489 收藏 -
time.Time.AppendText 从 Go 1.24 起提供面向 encoding.TextAppender 的 RFC 3339 文本输出。它适合把时间追加到已有字节缓冲区,但要处理错误返回,并注意它保存的是时区偏移而不是 Location 名称。489 收藏 -
archive/tar 的 Header.Name 不能直接拼接到解压目录。本文从 tar 条目检查、filepath.IsLocal 与 Rel 校验入手,给出拒绝绝对路径和 .. 逃逸的 Go 示例,并补上符号链接、文件大小和失败回滚边界。489 收藏 -
GoLand 默认并不提供“按需折叠单个方法”这类开箱即用的能力,通常需要借助 //region 和 //endregion 手动把代码包起来;同时还得在设置里开启 Custom regions,确认当前文件类型识别无误,并且保证注释成对、书写严格对应,否则很容易出现折叠位置错乱的问题。GoLand489 收藏