Go语言技术文章
-
channel range 结束只说明 channel 已关闭且缓存值已读完,不代表发送方 goroutine 已经退出。本文用发送方关闭 channel、WaitGroup 汇总和 context 取消,说明如何确认发送方真正结束并避免协程泄漏。125 收藏 -
Go 的 encoding/csv 支持把引号字段中的换行保留为同一条记录。本文说明正确的 CSV 写法、csv.Reader 的读取方式、字段数配置,以及如何用 ParseError、FieldPos 和 InputOffset 定位坏数据。434 收藏 -
Go 的 nil channel 不会就绪,因此放进 select 的收发分支永远不会被选中。本文用最小示例解释它与未就绪、已关闭通道的区别,并给出初始化、动态禁用和退出处理方案。128 收藏 -
用 Go 逐行解析简单配置文本:统一换行,跳过空行和整行注释,用 strings.Cut 保留值中的等号,并为格式错误与重复键返回行号。309 收藏 -
Go 中重复关闭 channel 会触发 panic,向已关闭 channel 发送也会 panic,而从已关闭 channel 接收会返回零值。本文用状态表、单一关闭者、多生产者协调和 done 广播说明如何修复。359 收藏 -
Go bufio.Scanner 读取超长行时,关键是在第一次 Scan 前调用 Buffer 设置初始缓冲区和最大 token 大小,并为换行符预留空间;如果行长不可控或需要恢复,则应改用 bufio.Reader。100 收藏 -
Go map 并发读写没有立刻崩溃,不代表代码安全。本文用 -race 定位冲突,说明普通 map 的锁封装方式,并比较 sync.Map 的适用边界。374 收藏 -
讲清 Go 自定义 net.Resolver.Dial 的调用边界,使用同一个 net.Dialer 转发上下文、网络类型和 DNS 地址,并接入 HTTP Transport 保留请求超时与本地网络配置。122 收藏 -
Go 动态查询不知道列数时,用 Columns 创建接收槽位,以 *any 安全处理普通值与 NULL,再结合 ColumnTypes 和 rows.Err 完成通用扫描。328 收藏 -
Go DNS 查询超时后仍看到延迟,常见原因不是 context 失效,而是调用了不带 context 的包级函数、纯 Go 解析发生重试,或 cgo 底层阻塞调用尚未收尾。本文给出区分三种情况的排查与写法。229 收藏 -
Go 的 Rows.ColumnTypes 不直接返回 nil 长度,ColumnType.Length 返回 int64 与 ok。本文区分固定长度、无界类型、驱动不支持和业务包装层 nil,并说明如何把长度元数据与 SQL NULL 分开处理。128 收藏 -
Go net.Resolver.PreferGo 改变域名解析结果时,先区分 Go 内置解析器与系统解析器,再检查 DNS 配置、A/AAAA 部分结果和 context 超时,避免把解析路径差异误判成 DNS 故障。166 收藏 -
Go database/sql 通过 Rows.ColumnTypes 读取查询结果的列名、数据库类型、长度、精度、可空性和建议扫描类型,并说明驱动不支持与 SQL NULL 的处理边界。319 收藏 -
Go HTTP 请求已经超时,但服务端日志还在继续时,先分清客户端、请求上下文和服务端 deadline 三个边界,再检查下游是否真正收到 ctx,最后用 Err 与 Cause 记录责任归属。465 收藏 -
Go 证书主机名校验失败时优先检查 SAN,不要把 CN 当作现代校验依据;本文区分 DNS SAN、IP SAN、ServerName 与 RootCAs,并给出自定义 CA 的排查和配置方法。272 收藏