Go问答技术文章
-
reflect.Value 的 panic 往往来自前置条件不成立。本文用 CanAddr、CanSet、CanInterface 分层解释可寻址性,并给出结构体字段安全赋值、nil 与类型错误处理及回归检查清单。300 收藏 -
Go 泛型约束里的 ~string、~int 表示一组底层类型相同的类型集合。本文用自定义类型和组合约束说明波浪线与精确类型项的区别,以及如何选择约束边界。459 收藏 -
结合 Go 1.27 对具体泛型方法的支持,解释为什么接口方法仍不能声明额外类型参数,并用顶层泛型函数、接收者提升参数、具体泛型方法和窄接口四种方案重构 API。267 收藏 -
Go 中同一算法只因数据类型不同而重复时适合使用泛型;不同类型需要不同方法实现、调用方只关心行为时更适合接口。本文用 Map 与 io.Reader 对比,并给出四项选择检查。230 收藏 -
Go 的 QueryRowContext 总会返回非 nil 的 Row,查询错误、无结果和类型转换问题会延迟到 Scan。本文用可运行的错误分支解释这一设计,并给出 sql.ErrNoRows、Context 和 Row.Err 的正确处理方式。358 收藏 -
Go 的 database/sql 中,事务回滚并不等于所有相关资源都已正确收口。本文从 Tx、Rows、Stmt 和连接池指标四个层面定位连接仍被占用的常见原因。215 收藏 -
Go 的 sql.DB 是并发安全的连接池句柄,不是单条连接。本文从数据库总容量、服务副本数与 DBStats 指标出发,给出 MaxOpenConns 等参数的估算和校准方法。243 收藏 -
Go 业务超时应优先使用 time.Now 保留的单调时间语义,日志和跨服务协议则使用墙上时间或剩余 Duration。本文拆解校时影响、API 选择、序列化边界和 RPC deadline 的决策方法。328 收藏 -
Timer Reset 后立刻超时,通常与旧版缓冲计时器通道中的过期值有关。本文对照 Go 1.23 前后语义,给出 chan-based Timer 的复用写法、AfterFunc 边界、版本判断和回退检查清单。484 收藏 -
Go 解析无时区字符串时相差八小时,通常是把 UTC 解析规则、目标 Location 和数值偏移混为一谈。本文用 Parse 与 ParseInLocation 对比说明“解释字符串”和“In 转换显示”的差别,并给出 RFC3339、数据库及比较时间的稳妥写法。368 收藏 -
WalkDir 的错误处理关键不在于一律忽略,而在于区分错误范围与结果完整性,再选择返回错误、继续遍历、跳过目录或停止全局遍历。455 收藏 -
os.DirFS 接收的是 io/fs 逻辑路径,不是任意操作系统路径,因此会拒绝 ..、绝对路径和空路径段。但这只阻止调用参数直接上跳,不能防住目录内符号链接逃逸,也不能消除相对根目录受 Chdir 影响的问题。本文说明校验方法与 os.Root.FS 的适用边界。214 收藏 -
解释 Go 文件原子替换为什么仍会在异常重启后丢失,并给出文件 Sync、Rename 与父目录 Sync 的完整耐久写入顺序和可复用代码。423 收藏 -
Go 流式处理最容易留下 goroutine 泄漏的地方,是只取消一端却没有唤醒另一端。本文用 context、io.Pipe、CloseWithError 和底层 ReadCloser 组合出一套双端退出方案。498 收藏 -
Go 的 io.Copy 会优先使用源的 WriterTo 或目标的 ReaderFrom,只有没有快路径时才进入通用缓冲循环;CopyBuffer 主要解决缓冲复用与尺寸实验,手写循环则用于进度、限速、校验等新增语义。本文解释三者的分派、错误处理和基准边界。243 收藏