Go问答技术文章
-
Go 的 tls.ClientSessionCache 命中率低,不一定是 LRU 容量太小。先确认真的建立了新 TLS 连接,再检查缓存键、会话票据、证书和协议兼容条件,最后用 ConnectionState.DidResume 验证。428 收藏 -
Go TLS 客户端遇到证书错误时,直接设置 InsecureSkipVerify=true 只会关闭证书链和主机名校验。本文按错误分支拆开 ServerName、RootCAs 与 VerifyConnection,给出保留安全校验的排查和配置方式。323 收藏 -
Go 的 tls.Config.ServerName 为空时,默认安全校验无法确定要匹配的主机名,握手会在证书校验前失败。本文拆开 SNI、拨号地址、SAN 和 RootCAs,给出直连 IP 与自定义拨号的正确配置。299 收藏 -
解释 Go TCPConn.CloseWrite 为什么只关闭本地发送方向,拆解已写入数据、FIN、服务端读取与 io.EOF 的关系,并给出发送完请求后继续读取响应的示例。210 收藏 -
Go net.ParseIP 解析 IPv4 时返回十六字节是因为采用了 IPv4-mapped IPv6 表示。本文说明如何用 To4 判断地址族、转换四字节数据,并区分 Equal、To16、ParseCIDR 与 netip 的使用边界。142 收藏 -
Go net.Resolver.LookupIP 取消后,标准库不会把半截地址列表作为成功结果返回。本文解释 Context 取消、并发共享查找、旧切片复用和错误判断之间的关系,并给出安全的地址缓存与排查写法。105 收藏 -
Go net.Dialer 的 Timeout 是相对拨号开始的最长时长,Deadline 是绝对截止时刻;二者和 Context 截止时间取最早值。本文用可复用的 DialContext 示例说明设置方式、多地址解析和超时判断。364 收藏 -
sql.Conn.Raw 能让 Go 程序临时访问驱动连接,但回调结束后 database/sql 只根据返回错误判断连接是否还能用。本文解释修改驱动状态后的复用风险,以及何时应返回 driver.ErrBadConn。334 收藏 -
Go 的 sql.Stmt 可以被多个 goroutine 并发使用,但 Close 不等于取消查询。本文说明正在执行、Rows 返回后和优雅停机时的正确关闭顺序。155 收藏 -
讲清 Go sql.Tx 回滚失败时如何保留原始业务错误,使用 errors.Join 组合异常,并区分 ErrTxDone 与 Commit 失败。106 收藏 -
Go database/sql 遍历结果集时,Rows.Next 返回 false 可能是正常耗尽,也可能是驱动或 context 错误。本文拆分 Scan、Rows.Err 和 Close 的职责,并给出可复用查询函数写法。263 收藏 -
Go 使用 sql.NullString 扫描可空文本列时,必须同时判断 String 和 Valid。本文用表格、代码和排查清单说明如何区分 NULL、空字符串与普通文本,并正确写回数据库。447 收藏 -
QueryContext 超时并不自动等于连接损坏。本文从 QueryContext、Rows、驱动取消接口和 ErrBadConn 四层判断连接是否还能安全回到连接池。270 收藏 -
从 Go string 与 C char 指针的表示差异出发,说明 C.CString、C.GoString、C.GoStringN 的选择、C.free 的释放责任,以及异步保存指针时的生命周期边界。432 收藏 -
在 Go 的 cgo 代码里,C.GoString 适合读取以 NUL 结尾的 char*,C.GoStringN 适合长度明确的数据;反向使用 C.CString 时还要释放 C 堆内存。本文用一个小示例把三种边界讲清楚。155 收藏