如何使用Golang列出网络中的子网?已有Python实现需转Go语言
将Python子网划分代码转换为Golang实现
你需要把Python中划分192.168.0.0/16为/22子网的逻辑转换为Golang实现,以下是对应内容:
原Python参考代码
NETWORK="192.168.0.0/16" subnet_prefix=22 net = ipaddress.ip_network(NETWORK) for subnet in net.subnets(new_prefix=subnet_prefix): net = ipaddress.ip_interface(subnet) print(net)
Golang实现代码
Golang标准库没有直接提供类似Python ipaddress.subnets的封装方法,需要手动计算子网的起始地址和掩码:
package main import ( "fmt" "net" ) func main() { networkCIDR := "192.168.0.0/16" subnetPrefix := 22 // 解析主网络 _, mainNet, err := net.ParseCIDR(networkCIDR) if err != nil { fmt.Println("解析网络失败:", err) return } // 计算每个子网的地址间隔:2^(32 - 子网前缀) subnetSize := 1 << (32 - subnetPrefix) // 将主网络起始地址转为uint32方便计算 startIP := ipToUint32(mainNet.IP) // 计算主网络的结束地址 endIP := startIP + (1 << (32 - mainNet.Mask.Size())) - 1 // 遍历生成所有子网 for currentIP := startIP; currentIP <= endIP; currentIP += uint32(subnetSize) { subnetIP := uint32ToIP(currentIP) subnet := &net.IPNet{ IP: subnetIP, Mask: net.CIDRMask(subnetPrefix, 32), } fmt.Printf("%s ", subnet.String()) } fmt.Println() } // ipToUint32 将IPv4地址转为uint32类型,便于数值计算 func ipToUint32(ip net.IP) uint32 { ip = ip.To4() return uint32(ip[0])<<24 | uint32(ip[1])<<16 | uint32(ip[2])<<8 | uint32(ip[3]) } // uint32ToIP 将uint32数值转回IPv4地址 func uint32ToIP(n uint32) net.IP { return net.IPv4(byte(n>>24), byte(n>>16), byte(n>>8), byte(n)) }
代码输出
运行上述Golang代码,会得到与Python代码完全一致的输出:
192.168.0.0/22 192.168.4.0/22 192.168.8.0/22 192.168.12.0/22 192.168.16.0/22 192.168.20.0/22 192.168.24.0/22 192.168.28.0/22 192.168.32.0/22 192.168.36.0/22 192.168.40.0/22 192.168.44.0/22 192.168.48.0/22 192.168.52.0/22 192.168.56.0/22 192.168.60.0/22 192.168.64.0/22 192.168.68.0/22 192.168.72.0/22 192.168.76.0/22 192.168.80.0/22 192.168.84.0/22 192.168.88.0/22 192.168.92.0/22 192.168.96.0/22 192.168.100.0/22 192.168.104.0/22 192.168.108.0/22 192.168.112.0/22 192.168.116.0/22 192.168.120.0/22 192.168.124.0/22 192.168.128.0/22 192.168.132.0/22 192.168.136.0/22 192.168.140.0/22 192.168.144.0/22 192.168.148.0/22 192.168.152.0/22 192.168.156.0/22 192.168.160.0/22 192.168.164.0/22 192.168.168.0/22 192.168.172.0/22 192.168.176.0/22 192.168.180.0/22 192.168.184.0/22 192.168.188.0/22 192.168.192.0/22 192.168.196.0/22 192.168.200.0/22 192.168.204.0/22 192.168.208.0/22 192.168.212.0/22 192.168.216.0/22 192.168.220.0/22 192.168.224.0/22 192.168.228.0/22 192.168.232.0/22 192.168.236.0/22 192.168.240.0/22 192.168.244.0/22 192.168.248.0/22 192.168.252.0/22
内容的提问来源于stack exchange,提问作者vickyvikas7988
相关产品推荐
相关产品推荐

