Go语言技术文章
-
Go 中排查 unicode/utf8 非法序列时,先用 Valid 判断整体字节,再用 RuneError 与 size=1 定位具体偏移,并区分截断、错误编码和真实替换字符。243 收藏 -
Go 的 range channel 不会自行判断生产完成,只有通道关闭并读完已发送值后才会结束。本文用发送方、协调者和消费者三种责任划分,说明多生产者安全 close、取消退出以及常见死锁的排查方法。242 收藏 -
围绕 Go encoding/json.Unmarshal 讲清目标类型、UnmarshalJSON、自定义字段转换、别名类型防递归,以及 SyntaxError 和 UnmarshalTypeError 的排查方法。242 收藏 -
Go 1.20 让 any 可以满足 comparable,但接口动态值仍可能让 == 在运行时 panic。本文区分严格可比较、约束满足和动态值检查,帮助设计安全的泛型比较 API。241 收藏 -
Go testing.T.Cleanup 回调 panic 不会被静默忽略。本文说明清理时机、后进先出顺序、测试主体 panic 与 cleanup panic 的区别,并给出用 t.Errorf、局部 recover 和 go test 排查重复清理与并发边界的写法。239 收藏 -
Go init 函数一多,启动顺序难查通常不是 init 本身失控,而是包级变量依赖、文件呈现顺序和隐藏副作用混在了一起。本文给出依赖定位、显式构造和重构检查方法。238 收藏 -
Go select 中的 default 不会等待通信,放进无界消费者循环就会造成 busy loop。本文说明如何改成阻塞式消费,或用 ticker 控制必要的周期检查,并通过 CPU、日志和退出行为验证修复。237 收藏 -
解释 Go http.Request.Clone 为什么不能让多个请求重复读取同一份 Body,并给出受限缓存、独立 Reader 和 GetBody 重试方案。237 收藏 -
Go strings.Builder 的 String 方法返回当前累计内容,后续 Write 是继续修改 Builder,而不是直接修改已经得到的 string。文章解释 Builder 缓冲区与字符串值的边界,并给出单一所有者、禁止复制非零 Builder、并发隔离和按需 strings.Clone 的处理方式。236 收藏 -
Go 中值变量能调用指针接收者方法,不代表值类型实现了接口。本文用方法集和接口赋值两个边界定位这类编译错误。235 收藏 -
Go 测试遇到 os.Exit 时,defer 和 t.Cleanup 不会执行。本文区分 os.Exit、runtime.Goexit 与测试失败路径,给出退出函数注入、子进程验证退出码和 TestMain 收尾的可维护做法。235 收藏 -
解释 Go 的 time.AfterFunc 中 Timer.Stop 返回 false 的准确含义,区分回调已启动与已完成,并给出用 started、done channel 显式协调的安全写法。235 收藏 -
Go 的 QueryRow 查询不到记录时,错误会在 Scan 阶段以 sql.ErrNoRows 返回。本文从查询条件、errors.Is、NULL 字段、类型转换和上下文五个角度排查,区分无数据与真正的数据库故障。233 收藏 -
通过 Go testing.T.Cleanup 的资源夹具示例,说明同一个测试对象为何按后注册先执行,并梳理父子测试、失败路径与并行测试的清理边界。232 收藏 -
Go url.JoinPath 适合拼接已经转义的 URL 路径元素,但不会替业务判断用户权限。本文说明如何限制用户值为单一路径段,并处理函数版、方法版、路径清理和 %2F 边界。232 收藏