Go问答技术文章
-
从一个批量拼接日志的场景出发,验证 bytes.Buffer.Grow 预留容量何时有用、WriteString 如何触发扩容,以及 Reset 为什么只清空长度而不承诺释放底层空间。352 收藏 -
解释 Go iter.Pull2 如何把 iter.Seq2 转成逐项拉取的 next 与 stop,重点验证提前停止时为什么必须调用 stop,以及双值序列结束后的边界行为。123 收藏 -
Go 的 slices.Collect 能把 iter.Seq 惰性序列一次收成切片。本文用分页数据和空输入例子说明 iter.Seq、slices.Collect、append 之间的关系,以及无法预估长度时的容量取舍。187 收藏 -
Go regexp 的 FindAllString 适合一次拿到全部匹配,但重复匹配、空匹配和 n 参数经常让结果数量出乎意料。本文用可运行示例拆解扫描游标与边界,并给出限制匹配次数的可靠写法。147 收藏 -
Go 使用 io.CopyN 复制固定长度数据时,源数据不足会返回已复制字节数和 EOF。本文用可复现的小例子拆开短读、剩余字节与错误判断,并说明什么时候应该改用 io.ReadFull。267 收藏 -
strings.SplitAfterSeq 返回惰性序列,适合逐段读取并保留分隔符。本文用一个可运行示例说明遍历时的调用链、空输入边界和与 SplitAfter 的取舍。127 收藏 -
URL.Redacted 会复制 URL 并把 User.Username 与密码替换成占位符,适合记录请求地址,但不能代替完整日志脱敏。本文用 Go 代码说明调用链、凭据边界和常见误区。261 收藏 -
sort.Search 找不到目标时返回 len 并不是越界,而是把第一个满足条件的位置定义为插入点。本文用单调谓词、边界表和可运行代码说明闭区间、找不到与插入位置的关系。411 收藏 -
context.WithoutCancel 会保留父 Context 的值,但切断取消、截止时间和 Err 传播。本文用请求收尾场景说明它的适用边界、调用链写法和超时风险,避免把它当成无限期后台执行开关。345 收藏 -
io.SectionReader 把底层 ReaderAt 限制在一段区间内,ReadAt 每次按给定偏移读取且不共享当前位置。本文用短代码拆开偏移换算、边界错误和并发复用条件。492 收藏 -
Go 的 subtle.ConstantTimeCompare 不只是在比较字节内容,输入长度不同也会直接影响结果。本文用可运行示例说明长度边界、常量时间语义和密钥校验中的正确写法。103 收藏 -
bytes.Reader.Seek 的负位置不是普通读取失败,而是偏移计算越过了起点。本文用可运行示例拆开 whence、offset、返回位置和错误处理边界,并说明为什么不能继续读取。435 收藏 -
sync.Map.LoadOrStore 会根据键是否已经存在,在并发初始化时返回新值或旧值。本文用一个可运行的缓存初始化例子拆开 loaded、类型断言和重复构造的边界。120 收藏 -
Go 的 os.File.ReadAt 适合多个 goroutine 按独立偏移量并发读取同一个文件,但每次调用仍要检查 n 和 err,尤其要正确处理 n < len(buf) 的短读与 io.EOF。152 收藏 -
time.AfterFunc 返回的 Timer 既可能尚未触发,也可能已经进入回调。本文用 Stop、Reset 和回调状态拆解竞态边界,给出可验证的防重复调度写法。461 收藏