Go问答技术文章
-
sql.Null[T] 的 V 字段即使在 Valid=false 时也必须持有类型 T 的 Go 零值,但这不代表数据库存了零值。本文说明 V、Valid 与 Value() 的语义,并给出避免误判 SQL NULL 的写法。497 收藏 -
sql.NamedArg 只把名称和值交给 database/sql 与具体驱动,并不会统一不同数据库的命名占位符。本文说明名称校验、驱动能力和 SQL 语法三个拒绝点,并给出可直接套用的排查代码。233 收藏 -
解释 Go database/sql 中 Rows.Next 返回 false 的双重语义,给出 Next、Scan、Err、Close 的正确组合,并说明如何避免迭代失败时静默返回半截数据。171 收藏 -
解释 Go sql.Conn.Raw 中 driverConn 的借用生命周期,说明为什么不能跨回调保存底层驱动连接,并给出同步调用、结果复制与 ErrBadConn 处理的安全模板。269 收藏 -
Go tls.Config 的 KeyLogWriter 能把 TLS 会话密钥写成 NSS key log 格式,方便 Wireshark 解密抓包,但长期启用会扩大密钥泄露面。本文给出受控调试、抓包定位和结束清理的完整做法。248 收藏 -
解释 Go tls.GetCertificate 在空 ServerName 场景下不触发的原因,拆解 Certificates、SNI 与默认证书回调的选择边界。501 收藏 -
Go 的 VerifyConnection 明确覆盖普通握手和恢复握手,用于保证自定义连接约束不会被会话恢复绕过。本文结合 DidResume、ClientSessionCache 与 HTTP 长连接复用说明调用边界和排查方法。200 收藏 -
Go context 的子任务不是重新获得一段独立超时,而是受父 Context 更早 deadline 约束。本文用可观察的 deadline、Err 和 Cause 排查提前 deadline exceeded,并给出按剩余预算创建子任务的写法。298 收藏 -
WithoutCancel 会保留父上下文中的值,但主动切断父级取消、截止时间和错误传播,所以 Deadline 返回 ok=false。本文说明这一设计,并给出为后台任务重新设置独立超时的安全写法。361 收藏 -
context.AfterFunc 返回的 stop 为 false 时,可能是回调已经启动,也可能是它此前已经被停止。本文用最小代码说明两种情况的边界,以及如何等待回调真正完成。146 收藏 -
Go compress/gzip 读取中途看似正常、到末尾才返回 ErrChecksum,通常是尾部长度或校验和没有通过。本文从 Reader 的结束语义、完整消费代码和 Writer.Close 收尾顺序说明如何定位与修复。404 收藏 -
gzip.Writer.Reset 会让对象回到类似刚由 NewWriter 创建的状态,只保留可复用的压缩器与压缩级别,不继承上一条流的 Header。本文说明正确复用顺序、Header 重配和对象池边界。218 收藏 -
gzip.Writer 会在首次 Write、Flush 或 Close 时把 Header 编码到底层输出;之后修改结构体只改变内存字段,无法回写已发出的字节。本文给出正确初始化、Reset 复用和防回归写法。221 收藏 -
Multistream(false) 只让 gzip.Reader 在首个成员后返回 EOF,并不会省略 trailer 校验。本文解释底层流越界读取的原因,并给出 bufio.Reader、io.ByteReader、Reset 与自定义尾部的可靠处理方式。277 收藏 -
Go compress/flate 的 Flush 只推出压缩器待处理数据,不提供网络消息边界。本文用长度帧、io.ReadFull、双层缓冲和 Close 说明接收端拿不全数据的排查与处理方法。278 收藏