ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

【go】IP相关工具类

2026/9/27 11:22:07 拓冰建站 浏览量
【go】IP相关工具类

文章目录

      • 1.判断ipv4 or ipv6
      • 2.计算cidr格式ip所含IP个数
      • 3.计算两个ip区间所含ip个数

1.判断ipv4 or ipv6

// return int 0:错误的ip 4:ipv4 6:ipv6
func CheckIp(ip string) int {if ip == "" {return 4}out := net.ParseIP(ip)if out == nil {return 0}if strings.Contains(out.String(), ".") {return 4}if strings.Contains(out.String(), ":") {return 6}return 0
}

2.计算cidr格式ip所含IP个数

func CountIPs(cidr string) (int64, error) {_, ipNet, err := net.ParseCIDR(cidr)if err != nil {return 0, err}mask := ipNet.Maskones, bits := mask.Size()numIPs := int64(1 << uint(bits-ones))//fmt.Printf("CIDR IP: %s\n", ipNet)//fmt.Printf("子网掩码: %s\n", mask.String())//fmt.Printf("IP个数: %d\n", numIPs)return numIPs, err
}

3.计算两个ip区间所含ip个数

func ipToInt(ip net.IP) int64 {ip = ip.To4()if ip == nil {return 0}ipParts := strings.Split(ip.String(), ".")ipInt := int64(0)for i := 0; i < 4; i++ {part, _ := strconv.ParseInt(ipParts[i], 10, 64)ipInt += part << ((3 - uint(i)) * 8)}return ipInt
}func main() {startIP := "183.62.142.241"endIP := "183.62.145.233"// ip格式校验start := net.ParseIP(startIP)if start == nil {log.Fatal("Invalid start IP address")}end := net.ParseIP(endIP)if end == nil {log.Fatal("Invalid end IP address")}startInt := ipToInt(start)endInt := ipToInt(end)count := endInt - startInt + 1fmt.Printf("Number of IPs between %s and %s: %d\n", startIP, endIP, count)
}