Go语言技术文章
-
Golang · Go问答 | 2星期前 | go · 性能 · bufio · 日志处理 · 错误排查 · 分块读取 Go bufio.Scanner token too long Scanner.Buffer 大日志行
Go 用 bufio.Scanner 逐行读取日志时,遇到超长 JSON 行会返回 token too long。本文用可复现实验比较默认上限、Scanner.Buffer 和 bufio.Reader 分块读取的内存与吞吐边界,给出线上日志处理的选择方法。501 收藏 -
Go 服务部署到容器后,日志时间常常从本地时间变成 UTC。本文拆开 time.Time 的位置、time.LoadLocation 的加载方式和 JSON 序列化边界,给出一套可回归验证的处理方案。500 收藏 -
订单同时有 paid、shipped、cancelled 三个布尔字段时,状态组合很快会失控。本文用 Go 实现一个显式订单状态机,梳理合法迁移、拒绝非法操作、落库与并发更新的边界。494 收藏 -
Go database/sql 连接池参数怎么配?本文用 MaxOpenConns、MaxIdleConns 和 ConnMaxLifetime 做一次最小实验,区分连接不足、等待过长与连接复用失效,并给出可验收的指标。494 收藏 -
Go Webhook 先验签再解析却得到 EOF,通常不是 JSON 有问题,而是 r.Body 已被提前读完。用单一读取边界、长度限制和常量时间比较,把验签与业务解析放回同一条可信数据路径。493 收藏 -
Golang · Go问答 | 4小时前 | net/http · Go问答 · 接口安全 · 版本迁移 · ServeMux · net/http 通配符 路由冲突 ServeMux Go 1.22 PathValue
Go 1.22 改造了 net/http.ServeMux 的模式语法和优先级,旧项目迁移时最容易踩到方法覆盖、通配符冲突和大括号语义变化。本文用最小代码验证匹配规则、冲突触发条件和上线前的兼容检查。490 收藏 -
Go 的 POST 请求第一次失败后重试,服务端却读到空 Body,通常不是服务端丢数据,而是请求体只被消费了一次。本文用 bytes.Reader、GetBody 和两次请求日志拆开这个问题,给出可验证的重试写法与边界。488 收藏 -
Go 项目的 CI 不该只在最后跑一次 go test。把触发范围、最小权限、go vet、go test 和 go build 拆成可读阶段,PR 出问题时能更快定位,也不会把不需要的写权限交给工作流。485 收藏 -
Golang · Go教程 | 2星期前 | WEB开发 · go · 表单 · 用户体验 · html/template · 表单校验 html/template 无障碍 Go教程 字段错误 输入回填 aria-invalid
Go 的 html/template 表单校验失败时,重新渲染页面不等于只显示一行错误。本文用字段级错误、旧值回填、aria-invalid 和焦点定位,把一次失败提交收敛成可修复的交互。485 收藏 -
Golang · Go问答 | 3星期前 | 单元测试 · HTTP · Go问答 · httptest · ResponseRecorder · 单元测试 HTTP响应 httptest Go问答 ResponseRecorder Handler测试
Go 用 httptest 写 Handler 单测时,常见现象是状态码为 0、响应头没生效,或读到的响应体为空。关键是区分 ResponseRecorder 的记录时机、WriteHeader 的提交边界,以及 Result 必须在 Handler 返回后再读取。文中给出可复用的最小测试和复查清单。481 收藏 -
Go 服务把 regexp.Compile 放进请求函数后,正则本身没变,延迟却会随并发上升。本文用基准对比请求内编译、包级预编译和受控缓存,解释编译成本、并发读写与动态规则的边界。479 收藏 -
Go 扫描上传目录或日志目录时,os.ReadDir、File.Readdir 和 filepath.WalkDir 的内存与排序行为并不一样。本文用一个目录索引小实验说明如何按需读取 DirEntry、避免无意排序,并在权限错误和部分结果场景下保留可用数据。478 收藏 -
接口定义已经改了,生成的 Go 文件却忘了提交,是多人协作里很隐蔽的一类问题。本文从生成入口、差异检查、提交前核对和 CI 门禁四个环节,搭建一套让 Protobuf 代码漂移无处藏身的 Go 项目工作流。473 收藏 -
Golang · Go问答 | 2星期前 | golang · 并发编程 · bytes.Buffer · 内存管理 · Go问答 · bytes reset bytes.Buffer Go内存 切片别名
Go 里把 bytes.Buffer.Bytes() 返回的切片保存下来,再复用 Buffer 写下一条消息,旧数据为什么会跟着变化?关键在于 Bytes 返回的是底层数组视图,不是独立副本。本文用消息编码场景说明 Reset、切片别名、Clone 拷贝和并发边界,给出可复查的安全写法。470 收藏 -
Go 1.23 的 slices.Collect 能把迭代器收集成切片,但它不是零成本转换。本文从惰性生成、空序列、容量增长和大结果集几个边界入手,配合可运行代码说明什么时候适合收集,以及如何避免一次性占满内存。470 收藏