在网络中,CIDR /32
表示该地址只能用作网络地址本身,不能分配给任何主机。因此,在计算主机数量时,应将 CIDR 地址按照其位掩码长度进行区分。对于 /32
子网掩码,主机数量总是为 1,而不是 -1。
以下是修正后的代码,可以正确地处理 /32
CIDR 地址:
package mainimport ("fmt""math""net"
)func main() {cidr := "10.22.2.1/32"hostCount, err := calculateHostCount(cidr)if err != nil {fmt.Println("Error:", err)return}fmt.Printf("Number of hosts in %s: %d\n", cidr, hostCount)
}func calculateHostCount(cidr string) (int, error) {_, ipNet, err := net.ParseCIDR(cidr)if err != nil {return 0, err}maskLen, _ := ipNet.Mask.Size()if maskLen == 32 {return 1, nil}hostCount := int(math.Pow(2, float64(32-maskLen))) - 2return hostCount, nil
}
通过添加了对 /32
子网掩码的特殊处理,现在代码会返回正确的主机数量 1,而不是 -1。