改造 Go 编译器以高效完成 IPv4 到 IPv6 映射
来源:vincent.bernat.ch — 2026-10-04
📋 概述
Vincent Bernat 探讨如何让 Go 高效地把 IPv4 地址映射为 IPv4-mapped IPv6 地址。netip.Addr 提供了 Unmap(),却缺少反向的 Map() 或 To6();维护者拒绝新增该方法,理由是用户应当写 netip.AddrFrom16(ip.As16()) 并让编译器去优化——而这一模式目前比原生方法慢约 8 倍。文章比较了三条路径:改标准库、写 helper、用 unsafe 操作内存布局,然后深入 Go 编译器,试图教会它把这个序列优化掉,并用反汇编与基准测试展示“用螺丝刀”为何比“用锤子”更合适。
🔑 核心要点
- netip.Addr 有 Unmap(),却没有反向的 Map()/To6()
- 维护者倾向让用户写 AddrFrom16(ip.As16()),并交给编译器优化
- 该模式目前比原生方法慢约 8 倍
- 比较改标准库、写 helper、用 unsafe 三条路径,并深入编译器优化该序列
💡 金句
这样的方法实现起来很简单,但 Go 维护者拒绝了它,理由是用户应当写 netip.AddrFrom16(ip.As16()) 并让编译器去优化。而今天,这个模式比原生方法慢八倍。
👍 0
👎 0
← 返回 Lobsters 首页