Go语言技术文章
-
Go database/sql 查询可空字符串时,使用 sql.NullString 同时保留 String 与 Valid,区分数据库 NULL、空字符串和普通文本;本文进一步说明 JSON 输出、写回参数与错误边界。501 收藏 -
围绕 Go database/sql 的事务边界,说明如何区分事务内校验结果与提交后的持久结果,正确处理 Rows、Rollback 和 Commit。501 收藏 -
os.File.ReadAt 返回 io.EOF 不一定代表本次没有数据。关键要先看 n 与 len(buf) 的关系,再决定处理有效字节、接受文件尾部或返回 io.ErrUnexpectedEOF。501 收藏 -
Go 1.23 起,失去引用的 time.After 定时器可以被回收,但高频循环每轮创建 timer 和 channel 仍有分配与调度成本。本文说明 time.After 的适用边界,以及如何用可复用 Timer 配合 Stop、排空和 Reset。501 收藏 -
Go strconv.ParseFloat 可以解析 NaN、Inf 和 Infinity,但 NaN、正负无穷与普通数字溢出并不是一回事。本文用 math.IsNaN、math.IsInf 和 ErrRange 给出清晰的分类方式。501 收藏 -
Go maps.Clone 只做浅克隆:本文用顶层 map、嵌套 map、切片和指针说明哪些数据独立、哪些仍会共享,并给出按 value 类型选择复制策略的实战判断。501 收藏 -
Go 的 range 循环里取变量地址,是否重复取决于循环变量是用 := 声明还是用 = 复用,以及模块采用的 Go 版本。本文用切片副本、切片元素地址和旧版本兼容写法说明如何判断与修复。501 收藏 -
围绕 Go net.Conn 写入超时排查一个常见误区:SetWriteDeadline 只约束当前连接的 I/O 截止时间,还要正确处理 n、err、缓冲写入和连接复用,才能判断请求是否真正收口。501 收藏 -
Go 1.22 引入的 base64.Encoding.AppendEncode 会把编码结果追加到已有 dst,而不是要求调用方先单独分配输出切片。本文用请求令牌拼接场景拆开 dst 前缀、EncodedLen 容量预估、append 扩容和输入边界,给出可核对的最小写法。501 收藏 -
用 httptrace.ClientTrace 的 GotConnInfo 判断 Go HTTP 请求拿到的是新连接还是曾经使用过的连接,并区分 WasIdle、IdleTime 与请求体关闭时机。501 收藏 -
netip.Prefix.Contains 判断网段时,结果异常通常不是位运算错了,而是 IPv4 与 IPv6 地址族、未规范化前缀或无效掩码混在了一起。本文用最小代码复现这些边界,并给出稳定的解析、规范化和测试方法。501 收藏 -
Golang · Go问答 | 2个月前 | go · 性能 · bufio · 错误排查 · 分块读取 Go bufio.Scanner token too long Scanner.Buffer 大日志行
Go 用 bufio.Scanner 逐行读取日志时,遇到超长 JSON 行会返回 token too long。本文用可复现实验比较默认上限、Scanner.Buffer 和 bufio.Reader 分块读取的内存与吞吐边界,给出线上日志处理的选择方法。501 收藏 -
本文用 Go 泛型实现切片保序去重,并进一步扩展到结构体按字段去重,讲清 comparable 约束、seen map、首条保留和常见边界处理。501 收藏 -
结构体指针赋值后字段没变,是因为误将指针变量重新赋值(如p=&User{...}),未解引用修改原内存;正确做法是用p.Name="new"或(*p).Name="new"。501 收藏 -
Go的Benchmark函数须以Benchmark开头、接收*testing.B参数,并在b.N循环中执行逻辑;框架自动调优b.N使总耗时≥1秒,需用b.ResetTimer()分离初始化开销。501 收藏