Go语言技术文章
-
用 context.WithCancelCause 把请求取消的真实原因带过边界,并通过 errors.Is、context.Cause 和并发测试确认错误链没有丢失。284 收藏 -
线上接口偶发慢几百毫秒,等问题出现后再启动完整 trace 往往已经晚了。Go 1.25 的 runtime/trace.FlightRecorder 会把最近一段运行轨迹保存在内存环形缓冲区,异常触发时再导出,本文说明 MinAge、MaxBytes、Start、WriteTo 的最小用法和生产边界。279 收藏 -
Go 服务偶发变慢时,runtime/metrics 能把 GC 频率、暂停和堆目标放到同一组可采样指标里。本文从一次延迟抖动开始,说明如何选指标、对齐时间窗口,并排除把正常回收误判成 GC 压力。278 收藏 -
Go 的 net.Conn.SetDeadline 会把读写截止时间写入连接状态,超时后不会因为下一次读写自动恢复。本文用一个连接复用场景说明清理时机、读写边界和可验证的修复写法。277 收藏 -
Go 里两个 time.Time 看起来显示相同,直接用 == 仍可能比较出不同结果。本文从单调时钟、Location 和时间精度三个边界说明 Equal 与 == 的区别,并给出可验证的比较写法。276 收藏 -
Golang · Go问答 | 3小时前 | 并发 · 切片 · golang · 内存管理 · Go问答 · 代码排错 · 数据隔离 底层数组 append Go问答 slices.Clone 切片拷贝
slices.Clone 和 append 都能复制 Go 切片,但容量、底层数组别名和空切片行为并不完全相同。本文用可运行示例说明如何判断拷贝是否隔离,以及在并发和接口返回中该怎么选。276 收藏 -
Golang · Go教程 | 2星期前 | HTTP · go · 网络安全 · net/http · SSRF · 安全边界 · SSRF net/http net/url Go教程 netip 出站请求 内网地址
Go 服务如果允许按参数访问远端 URL,真正的风险不只在字符串校验:DNS 解析后的地址、IPv4-mapped IPv6、重定向目标和代理配置都可能改变出站边界。本文用 net/url、netip 和 net/http 写一套可复查的 SSRF 防护骨架,并说明哪些判断必须在连接前和每次重定向时重复。275 收藏 -
用一个可运行的小例子说明 netip.Addr 为什么能直接做 map 键,并拆开零值、IPv4 映射和 net.IP 迁移时最容易踩到的边界。275 收藏 -
c.JSON()更安全,因自动设置Content-Type、状态码并处理json.Marshal()错误;手动用c.Data()+json.Marshal()易漏header、错status或panic。直接用 c.JSON(),别手写 json.Marshal() 再塞 c.Data()——Gin273 收藏 -
解释 Go io.Copy 看似复制不完整时如何区分 EOF、短写入和自定义 Reader 错误,并给出可复现的检查代码。272 收藏 -
Go 服务把 regexp.Compile 放进请求路径后,p99 往往先于 CPU 告警变差。本文用一组可复现的基线对比,说明预编译、有限缓存和输入边界各自解决什么问题,并给出可验收的 benchmark 方法。271 收藏 -
Golang · Go教程 | 2星期前 | golang · https · TLS · Go教程 · 生产运维 · 证书轮换 · atomic.Value Go HTTPS证书热切换 GetCertificate tls.Certificate 证书轮换
Go HTTPS 服务轮换证书时,不必为了替换文件重启进程。本文用 tls.Config.GetCertificate 和 atomic.Value 保存当前证书,演示新连接切换、旧连接保持、加载失败回退与指标核对,给出适合生产灰度的实现边界。267 收藏 -
在Go语言里,float64采用的是IEEE 754标准。也正因为如此,它没法把大多数十进制小数准确无误地存下来,比如π、0.1这类数字,放到二进制浮点体系里就只能做近似表示。结果就是,在面积累加这类连续运算中,末尾往往会冒出一点点误差,例如178.53981633974483最终可能变成178.5265 收藏 -
Golang · Go问答 | 1天前 | 并发 · golang · 错误处理 · Context · Go问答 · Go 错误处理 Go问答 context.WithCancelCause context.Cause context.Err
Go 并发任务被取消时,ctx.Err() 只能告诉你是取消还是超时,context.Cause(ctx) 才能保留业务失败原因。本文用一个可运行的任务链说明 Cause、Err、errors.Is 和错误包装各自负责什么。263 收藏 -
泛型代码里通过 reflect.TypeOf((*T)(nil)).Elem() 获取类型既绕又容易误读。本文用 Go 1.22 的 reflect.TypeFor[T]() 重写一个注册表实验,比较 nil、指针和接口类型的结果,并给出版本兼容与测试边界。259 收藏