Go语言技术文章
-
Go select 一旦加入 default,在所有通信都未就绪时就会立即返回;如果它被放进无条件 for 循环,循环会反复检查而形成忙等。本文解释选择规则,并给出阻塞等待、ticker 和退避三种改法。431 收藏 -
Go 1.23 及以上可以用 runtime/debug.SetCrashOutput 把未处理 panic 和致命错误额外写入文件。本文说明文件打开、句柄复制、重复配置、关闭输出,以及日志轮换和监控进程的边界。431 收藏 -
Go slices.Chunk 会把切片按最多 n 个元素分成连续子切片,最后一组不足 n 个时会原样保留,不会补零或丢弃。本文说明尾组、空输入、非法 n 与子切片容量的处理边界。431 收藏 -
Go 的 math.Float32frombits 是按 IEEE 754 位模式把 uint32 重解释为 float32,不等同于 float32(x) 的数值转换。本文用对比代码说明两者差异,并给出按字节序组装输入、处理特殊值和保持可逆性的实用边界。431 收藏 -
Go Expr 可用 ?. 保护可空对象访问,再用 ?? 提供 nil 回退值。通过结构体环境示例,区分可空指针、缺失 Map 键、未知字段和空字符串,并保留编译与运行错误的处理出口。431 收藏 -
fmt.Appendf 可以把错误的可读文本追加到 []byte,但不能像 fmt.Errorf 的 %w 那样保留可追踪的错误链。本文用日志、协议缓冲和 Writer 场景说明两者如何配合。431 收藏 -
Go flag.FlagSet 的 ContinueOnError 会把解析失败作为错误返回,ExitOnError 则在解析失败时结束进程。本文结合子命令、测试和正式 CLI 入口,说明两者在控制流、退出码和错误接管方式上的区别。431 收藏 -
讲清 Go net.IP.Equal 如何比较 4 字节 IPv4、IPv4-mapped IPv6 和普通 IPv6,为什么要单独处理 nil 与非法长度,以及单地址等价与 CIDR 网段包含的区别。431 收藏 -
Go SSE 处理器已经 Write,浏览器仍可能迟迟收不到。本文用 ResponseController.Flush、SetWriteDeadline、代理缓冲检查和断连测试拆解完整刷新链路。430 收藏 -
http.ResponseController 把 HTTP 响应刷新和连接劫持能力统一到一组探测方法中。本文用真实 Handler 场景拆开 Flush、Hijack 与 ErrNotSupported 的调用边界,说明什么时候应当回退,以及如何验证响应状态。430 收藏 -
Go generate 之后生成文件被格式化脚本改回旧内容,通常是生成器和外层脚本同时拥有最终写入权。本文用 go/format、临时文件和原子重命名整理一条稳定的生成流水线。430 收藏 -
Go slices.Clone 会复制切片的元素数组,但它是浅拷贝:值类型元素可独立修改,指针、map 或嵌套切片仍需按字段判断是否共享。本文用代码和边界表说明 Clone、copy 与深拷贝的选择。430 收藏 -
用 Go 的 http.Cookie 设置 SameSite、Secure、HttpOnly 和过期时间,解释三种 SameSite 模式、MaxAge 正负值以及从 Set-Cookie 响应头排查属性不生效的方法。430 收藏 -
竞态修复后吞吐下降不一定是锁竞争。本文用 mutex profile、block profile 和固定基线,判断新增临界区是否真正造成吞吐损失。430 收藏 -
fs.Sub 不会改写原始 embed.FS,也不会修改 HTTP 路由。本文区分嵌入路径、子文件系统相对路径和 URL 前缀,解决读取与遍历时目录前缀重复的问题。430 收藏