Функция net.ParseCIDR

Функция net.ParseCIDR анализирует строку, содержащую сетевой адрес в формате CIDR (Classless Inter-Domain Routing), и возвращает два значения: сам IP-адрес (тип net.IP) и сеть с маской (тип net.IPNet). В первый параметр функция принимает строку с адресом вида "192.0.2.0/24" или "2001:db8::/32".

Если строка не соответствует формату CIDR, функция возвращает nil, nil и ошибку. Важно отметить, что функция не проверяет, принадлежит ли IP-адрес указанной сети, она лишь возвращает разобранные компоненты.

Синтаксис

goip, ipnet, err := net.ParseCIDR(cidr)

Пример

Давайте разберем строку CIDR для IPv4-адреса:

gopackage main

import (
  "fmt"
  "net"
)

func main() {
  cidr := "192.0.2.0/24"
  ip, ipnet, err := net.ParseCIDR(cidr)
  if err != nil {
    fmt.Println("Error:", err)
    return
  }

  fmt.Println("IP:", ip)
  fmt.Println("Network:", ipnet)
  fmt.Println("Mask:", ipnet.Mask)
}

Результат выполнения кода:

go"IP: 192.0.2.0"
"Network: 192.0.2.0/24"
"Mask: ffffff00"

Пример

Разберем строку CIDR для IPv6-адреса:

gopackage main

import (
  "fmt"
  "net"
)

func main() {
  cidr := "2001:db8::/32"
  ip, ipnet, err := net.ParseCIDR(cidr)
  if err != nil {
    fmt.Println("Error:", err)
    return
  }

  fmt.Println("IP:", ip)
  fmt.Println("Network:", ipnet)
  fmt.Println("Mask:", ipnet.Mask)
}

Результат выполнения кода:

go"IP: 2001:db8::"
"Network: 2001:db8::/32"
"Mask: ffffffff000000000000000000000000"

Пример

Попробуем передать некорректную строку CIDR:

gopackage main

import (
  "fmt"
  "net"
)

func main() {
  cidr := "192.0.2.0/33"
  ip, ipnet, err := net.ParseCIDR(cidr)
  if err != nil {
    fmt.Println("Error:", err)
    return
  }

  fmt.Println("IP:", ip)
  fmt.Println("Network:", ipnet)
}

Результат выполнения кода:

go"Error: invalid CIDR address: 192.0.2.0/33"

Пример

Полученную сеть можно использовать для проверки принадлежности адреса:

gopackage main

import (
  "fmt"
  "net"
)

func main() {
  cidr := "10.0.0.0/16"
  _, ipnet, err := net.ParseCIDR(cidr)
  if err != nil {
    fmt.Println("Error:", err)
    return
  }

  ip := net.ParseIP("10.0.1.2")
  if ipnet.Contains(ip) {
    fmt.Println("IP belongs to network")
  } else {
    fmt.Println("IP does not belong to network")
  }
}

Результат выполнения кода:

go"IP belongs to network"

Смотрите также

  • функцию net.ParseIP,
    которая разбирает IP-адрес в строковом представлении
  • функцию net.SplitHostPort,
    которая разделяет адрес хоста и порта
  • функцию net.JoinHostPort,
    которая объединяет хост и порт в один адрес
  • тип net.IPNet,
    который представляет сеть с маской подсети