Go语言技术文章
-
time.LoadLocation返回nil的主因是传入非法时区名(如"CST"、"GMT+8"或拼写错误),仅支持IANA标准名(如"Asia/Shanghai");系统缺tzdata或Go未嵌入时区数据(如Alpine镜像)也会导致失败。261 收藏 -
应统一用len(s)==0判断切片是否为空,而非s==nil;因nil切片和空切片len均为0且len()调用安全,而s==nil仅适用于具体切片类型、在interface{}或泛型中会编译失败,且JSON序列化语义不同。261 收藏 -
Go sync.Pool 能减少临时对象分配,但它不是可靠缓存。本文用日志和基准测试拆开 Get、Put、GC 清空、对象重置与并发场景,说明哪些对象适合放进 Pool,哪些数据必须交给真正的缓存或业务存储。261 收藏 -
benchstat不能直接判断性能变好或变坏,仅提供统计推断(如p值、置信区间),需结合效应量、业务场景与系统行为综合判断。260 收藏 -
copy大数据时单元素更便宜,因底层调用runtime.memmove,利用CPU缓存行预取、自动向量化(AVX/NEON)及零分支开销,实现高效连续内存搬运。259 收藏 -
泛型代码里通过 reflect.TypeOf((*T)(nil)).Elem() 获取类型既绕又容易误读。本文用 Go 1.22 的 reflect.TypeFor[T]() 重写一个注册表实验,比较 nil、指针和接口类型的结果,并给出版本兼容与测试边界。259 收藏 -
Go云原生事件驱动架构核心是将事件作为一等公民,通过结构体定义契约、Channel+Worker池实现轻量总线、map注册处理器,并增强幂等、重试与可观测性。258 收藏 -
Go跨包复用核心是导入路径与文件系统、go.mod、Git仓库三者严格一致:需用可导出标识符、合法importpath、模块初始化(go.mod),避免GOPATH干扰,私有包可通过replace或GitURL共享。258 收藏 -
swaginit报错主因是缺失或格式错误的//@title等注释,必须位于main包文件中且连续无空行;类型需显式import、结构体及字段均须首字母大写并带jsontag;docs目录须与二进制同级;CI中需指定-g入口文件路径。258 收藏 -
Golang · Go问答 | 1个月前 | HTTP · ResponseWriter · net/http · Go问答 · 后端排错 · Go WriteHeader ResponseWriter HTTP 状态码 superfluous response.WriteHeader
Go 服务日志出现 superfluous response.WriteHeader,通常不是框架故障,而是同一个请求路径已经写出最终状态码,后续分支又继续写了一次。文章用一个订单创建接口复现问题,解释 Write 与 WriteHeader 的先后边界,并给出 return 收口、响应助手分层和 httptest 回归检查的最小修复方案。258 收藏 -
Golang · Go问答 | 1星期前 | 并发 · 单元测试 · go · Context · AfterFunc · Go问答 context.AfterFunc context.CancelFunc Go回调
Go 的 context.AfterFunc 适合在上下文取消后触发清理动作,但 Stop 返回 false 时回调可能已经开始或即将开始。本文用超时清理场景说明回调生命周期、竞态窗口、幂等保护和测试验收边界。258 收藏 -
直接用SETBIT因日活是布尔型而非计数,位图节省内存且支持高效交并差;需将用户ID映射为非负整数offset,推荐用预分配ID或自增主键;Go中用go-redis/v9的SetBit和BitCount,注意key带日期前缀、设TTL、防跨天污染与分片扩展。257 收藏 -
rate.NewLimiter(rate.Limit,burst)的两个参数分别是令牌生成速率(每秒补充令牌数,float64)和桶最大容量(int),burst至少应与rate相当(如rate.Limit(10)配burst=10),过小导致首秒大量拒绝,过大则限流失效;rate<0.01时因纳秒精度丢失行为异常。257 收藏 -
Go 1.26 为 runtime/pprof 增加了实验性的 goroutineleak profile,可以帮助发现因 channel、锁等并发原语永久阻塞的协程。本文用一个提前返回的收集器复现泄漏,说明启用开关、采样方式、误判边界和回滚检查。257 收藏 -
binary.Varint专为ProtobufZigZag编码设计,解析[]byte{0x18}得12、{0x1a}得-13是其正确行为;无符号字段(如ID、长度)必须用binary.Uvarint,二者均只读首个varint且忽略后续字节。256 收藏