Go语言技术文章
-
bytes.Buffer.Reset 会清空长度,却保留底层存储。本文用基准和 Cap 指标拆开 Reset、Grow、大请求复用之间的关系,给出什么时候复用、什么时候换成新 Buffer 的判断边界。333 收藏 -
context.Err 只能告诉调用方请求已取消或超时,context.Cause 才能保留触发取消的具体原因。本文用一个可运行的 Go 示例说明 WithCancelCause、Cause 和 Err 的关系,以及父子 context 竞争取消时的边界。428 收藏 -
数据库 · Redis | 4星期前 | Redis · 查询优化 · 性能边界 · Sorted Set · 集合运算 · redis limit Sorted Set ZINTERCARD 集合交集 基数统计
Redis ZINTERCARD 只返回多个 Sorted Set 的交集数量,适合在推荐、活动资格和筛选接口中先做交集基数判断。本文用 redis-cli 拆开 ZINTERCARD 与 ZINTER、LIMIT 的差别,说明空 key、集群同槽和“大于阈值”判断的边界。254 收藏 -
Go embed.FS 读取内嵌资源时,fs.Sub 的根路径、文件名斜杠和 os.Getwd 工作目录经常被混在一起。本文用一个可运行的小实验定位“文件明明在项目里却读不到”的原因,并给出模板、测试和部署检查写法。449 收藏 -
分页接口里的 page、size 不是普通字符串:负数、超大整数和乘法溢出会把查询范围、内存占用甚至数据库压力一起带偏。本文用 Go 标准库拆开参数解析、上限校验、LIMIT/OFFSET 计算和验收清单。225 收藏 -
Go 1.23 的 slices.Chunk 能把切片按固定大小拆成批次,但空切片、n 小于 1、最后一批不足和底层数组共享都容易被误读。本文用批量写入场景说明它的返回边界、内存行为与测试方法。127 收藏 -
复合索引不一定必须从第一列开始过滤。本文用订单明细查询说明 MySQL 8.4 Skip Scan 如何跳过索引前缀、什么条件下能被优化器选中,以及如何用 EXPLAIN、统计信息和会话级开关验收,避免把一次命中误判成长期方案。394 收藏 -
Go 模块下载并不只是从代理拿一个 zip。本文从一次依赖校验异常出发,拆开 GOPROXY、go.sum、GOSUMDB、GOPRIVATE 的信任边界,给出公有依赖校验、私有模块配置和替换后复核的实战检查清单。413 收藏 -
Go 模块下载并不只是从代理拿一个 zip。本文从一次依赖校验异常出发,拆开 GOPROXY、go.sum、GOSUMDB、GOPRIVATE 的信任边界,给出公有依赖校验、私有模块配置和替换后复核的实战检查清单。351 收藏 -
Go 错误判断不要只比较 Error() 字符串。本文用最小示例拆开 fmt.Errorf 的 %w、errors.Join 的多分支包装和自定义 Is 方法,说明 errors.Is 什么时候能匹配、为什么 errors.Unwrap 对 Join 不够用,以及如何写出可回归的错误契约。407 收藏 -
OpenTelemetry Go 编译期自动插桩 v1 已稳定发布。本文用 otelc go build 做一次最小试用,解释它如何覆盖 net/http、database/sql、gRPC、Redis 与运行时指标,并给出与 eBPF、手工埋点组合时的判断边界。295 收藏 -
Golang · Go问答 | 4星期前 | 并发 · 故障排查 · Go问答 · encoding/json · 配置中心 · sync/atomic · encoding/json atomic.Value Go配置热加载 Decoder 配置复用 旧值残留
Go 服务热加载 JSON 配置时,偶发读到旧值通常不是文件没有更新,而是解码目标被复用、缺失字段没有覆盖旧内容,或读写过程没有通过不可变快照切换。本文从一次线上故障切入,给出可复现证据、修复代码和回归检查。311 收藏 -
用 MySQL 8.0 的 SKIP LOCKED 做并发任务抢占,关键不在于把锁语句拼出来,而在于限定索引范围、保持短事务、正确处理空队列,并用状态更新和幂等键验收重复消费。228 收藏 -
Redis 客户端缓存开启 CLIENT TRACKING 后,如何确认读过的键能收到失效通知?本文用 RESP3、BCAST、NOLOOP 和 TRACKINGINFO 组成一套可复查的验收流程。500 收藏 -
用 Go 封装 Ollama 本地 API 健康检查:先确认服务版本,再核对模型清单,最后用短请求验证生成能力,并处理连接超时、模型未安装和常驻内存边界。216 收藏