Go问答技术文章
-
bytes.Buffer.Reset 会清空可读数据,却保留底层存储。本文用容量、切片别名和并发边界说明复用何时有益、何时会让大块内存长期驻留。334 收藏 -
当正则模式的一部分来自用户输入或配置时,regexp.QuoteMeta 能把文本中的正则元字符当作普通字符处理。本文比较直接拼接与 QuoteMeta 的匹配结果,并说明它不适合替代完整正则语法的边界。331 收藏 -
Go 标准库 flag 默认适合单值参数,但 --tag=a --tag=b 这类重复参数需要自定义 flag.Value。本文用一个可运行的小工具说明 String、Set、Parse 的关系、默认值处理和常见边界。331 收藏 -
Golang · Go问答 | 2天前 | 并发 · golang · 泛型 · 迭代器 · Go 1.23 · 资源释放 Stop Go iter.Pull2 iter.Seq2 双值迭代器 next
Go 的 iter.Pull2 把 Seq2 转成逐项读取的 next/stop 函数,适合需要手动控制消费节奏的场景。本文用键值迭代器说明 next 的结束判断、提前停止时的资源释放、panic 传播与并发边界,并给出可运行的安全写法。330 收藏 -
Go 的 time.Time.Round 不只接收正数时长。本文用时间线示例拆开 Round、Truncate 和 Add 在负数 duration、半间隔与零值场景下的差异,给出可直接运行的判断代码。330 收藏 -
CloseIdleConnections 只清理 Transport 中已经空闲的 keep-alive 连接,不会打断正在使用的请求。文章用发布切换场景说明它与 Transport 复用、响应体关闭和灰度验证的边界。329 收藏 -
sync.OnceFunc 会缓存初始化函数的 panic 结果,失败后再次调用不会自动重试。本文用最小示例拆开成功、失败和显式重试三种边界。325 收藏 -
time.Time.Round 按绝对时间而不是显示出来的本地小时取整,所以跨日期、带时区和带单调时钟的值容易出现误判。本文用可复现的 Go 示例拆开 Round、Truncate、Location、== 与序列化的边界。325 收藏 -
reflect.TypeFor[T]() 能在泛型代码里直接取得类型参数 T 的 reflect.Type,避免用零值或指针哨兵绕一圈。本文用类型注册表拆开 nil、指针、接口类型和缓存键的边界,说明它与 TypeOf 的职责差异。322 收藏 -
从一个一次性迭代器出发,拆开 slices.SortedFunc 的收集、比较与返回边界,说明如何处理结构体排序、空序列和比较器契约。317 收藏 -
Golang · Go问答 | 1天前 | 标准库 · 错误处理 · IO · 文件读取 · Go问答 · Go LimitReader eof Reader io.LimitedReader 读取上限
io.LimitedReader 读完 N 个字节后会先把 N 变成 0,并在下一次读取时返回 EOF;这和底层 Reader 是否已经到达结尾不是一回事。本文用可运行示例拆开上限耗尽、真实 EOF 和底层错误的判断边界。316 收藏 -
Golang · Go问答 | 18小时前 | 标准库 · 并发编程 · 原子操作 · Go问答 · 竞态排查 · Go sync/atomic CompareAndSwap atomic.Bool 并发状态
用一个一次性初始化场景拆开 atomic.Bool.CompareAndSwap 的成功与失败路径,说明它如何把状态切换和抢占执行权合成原子动作,以及失败后何时跳过、何时重试。316 收藏 -
多个 goroutine 同时查询时,如何只接收一个可用结果并让其余任务及时退出?本文用一个可复现的 Go 示例拆开 select 竞争、取消信号和结果通道关闭顺序。312 收藏 -
Go 的 regexp.FindStringSubmatchIndex 返回的是字节下标,不是字符位置。本文用带中文的日志片段说明如何读取捕获组、处理未匹配分组,并避免切片越界。312 收藏 -
Go 的 bytes.Buffer.AvailableBuffer 返回可借用的尾部空间,但它不是已经写入的数据。本文用最小程序说明 Bytes、AvailableBuffer、Write 与 Reset 的边界,避免把缓冲容量误当成有效长度。312 收藏