2 回答
TA贡献2080条经验 获得超4个赞
如果(正如您的测试用例似乎暗示的那样)您不关心哪一边包含哪一边,而只是有重叠,这应该就足够了。
func intersect(n1, n2 *net.IPNet) bool {
return n2.Contains(n1.IP) || n1.Contains(n2.IP)
}
TA贡献1810条经验 获得超5个赞
您可以利用这样一个事实,即 IP 地址 ( net.IP) 和网络掩码 ( net.IPMask) 只是[]byte包含二进制 IP 地址的字节片 ( )。您可以在网络地址及其掩码上使用常用的按位运算符来确定一个网络是否是另一个网络的子网:
func intersect(n1, n2 *net.IPNet) bool {
for i := range n1.IP {
if n1.IP[i] & n1.Mask[i] != n2.IP[i] & n2.Mask[i] & n1.Mask[i] {
return false
}
}
return true
}
此函数缺少一些基本的健全性检查(例如,当传递一个 IPv4 和一个 IPv6 地址时它会中断),但该示例应该足以了解其要点。
除了第一个之外,它在您问题的所有测试用例中都成功。但毕竟,1.1.0.2/16并不是真正的子网1.1.1.1/24(反之亦然)。
https://play.golang.org/p/Kur5n2hfLg
- 2 回答
- 0 关注
- 206 浏览
添加回答
举报
