-
Notifications
You must be signed in to change notification settings - Fork 0
xnet
omeyang edited this page Sep 17, 2026
·
1 revision
稳定性:Stable · 覆盖率:98.4% · 源码:
pkg/util/xnet
IP 地址工具。基于 net/netip + go4.org/netipx,提供 IP/CIDR/范围解析、分类、序列化与高性能转换。
- 解析 IP / CIDR / 掩码 / 范围(
10.0.0.0/24、10.0.0.1-10.0.0.5) - IP 分类(私有 / 链路本地 / 组播 / 广播 / 文档保留等)
- 高效 IP↔uint32/big.Int 转换
- 范围序列化(
WireRangeJSON/BSON/YAML 互通)
import "github.com/omeyang/xkit/pkg/util/xnet"
// 解析
r, _ := xnet.ParseRange("192.168.1.0/24")
size := xnet.RangeSizeUint64(r)
// 分类
cls := xnet.Classify(netip.MustParseAddr("10.0.0.1"))
fmt.Println(cls.IsPrivate, cls.String()) // true, "private"
// 批量集合
set, _ := xnet.ParseRanges([]string{"10.0.0.0/8", "192.168.0.0/16"})
fmt.Println(set.Contains(netip.MustParseAddr("10.1.1.1"))) // true| 名称 | 说明 |
|---|---|
ParseRange / ParseRanges |
解析 IP/CIDR/掩码/范围 |
Classify(addr) Classification |
15 字段分类(私有/链路本地/组播/广播/Benchmark/Documentation 等) |
WireRange |
JSON 友好范围({"start":"...","end":"..."},含 IsZero()) |
AddrFromUint32 / AddrToUint32 |
IPv4 ↔ uint32 |
AddrFromBigInt / AddrToBigInt |
IP ↔ big.Int |
FormatFullIP / ParseFullIP |
全长格式化(IPv4 192.168.001.001、IPv6 32 hex) |
RangeSize / RangeSizeUint64 |
范围大小(IPv4 快路径 1 alloc) |
MergeRanges |
合并重叠/相邻范围 |
-
unmapAddr在所有 ParseRange 路径里归一化 IPv4-mapped IPv6 → 纯 IPv4 -
错误链:跨包用
%w包装ParseAddr底层错(FG-M fix) -
FormatFullIPAddrIPv6 路径:hex.Encode+ 栈[32]byte缓冲,1 alloc vs 上一版的 2 -
IsBroadcast优先级在IsMulticast之前;255.255.255.255是 broadcast 不是 reserved -
IsBenchmark覆盖 IPv4(198.18.0.0/15)+ IPv6(2001:2::/48RFC 5180) -
WireRangeFromAddrs拒绝带 zone ID 的地址(避免 round-trip 破损)
- 概念:
- API:api.md#pkgutilxnet