下面是修改后的代码示例,可以同时判断 IPv4 和 IPv6 地址运算后的子网段是否相同:
package main
import (
"fmt"
"net"
)
func main() {
ip1 := "1.1.1.1"
ip2 := "2.2.2.2"
maskLen := 24
subnet1, _ := getSubnet(ip1, maskLen)
subnet2, _ := getSubnet(ip2, maskLen)
if subnet1.IP.Equal(subnet2.IP) && subnet1.Mask.String() == subnet2.Mask.String() {
fmt.Println("子网段相同")
} else {
fmt.Println("子网段不相同")
}
ip3 := "2001:db8::10"
ip4 := "2001:db8::20"
maskLenIPv6 := 64
subnet3, _ := getSubnet(ip3, maskLenIPv6)
subnet4, _ := getSubnet(ip4, maskLenIPv6)
if subnet3.IP.Equal(subnet4.IP) && subnet3.Mask.String() == subnet4.Mask.String() {
fmt.Println("子网段相同")
} else {
fmt.Println("子网段不相同")
}
}
// 根据IP地址和掩码长度获取子网段
func getSubnet(ip string, maskLen int) (*net.IPNet, error) {
ipAddr := net.ParseIP(ip)
var mask net.IPMask
if ipAddr.To4() != nil { // IPv4
mask = net.CIDRMask(maskLen, 32)
} else { // IPv6
mask = net.CIDRMask(maskLen, 128)
}
subnet := &net.IPNet{
IP: ipAddr.Mask(mask),
Mask: mask,
}
return subnet, nil
}
在修改后的代码中,我们新增了对 IPv6 地址的判断和处理。根据输入的 IP 地址类型(IPv4 或 IPv6),使用不同的掩码长度,并将其与获取到的子网段进行比较判断。
请注意,在实际应用中,还需要考虑错误处理、边界条件等情况,并根据具体需求进行进一步的逻辑完善。
内容由零声教学AI助手提供,问题来源于学员提问