Функция 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-адрес указанной
сети, она лишь возвращает разобранные компоненты.
Синтаксис
ip, ipnet, err := net.ParseCIDR(cidr)
Пример
Давайте разберем строку CIDR для IPv4-адреса:
package 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)
}
Результат выполнения кода:
"IP: 192.0.2.0"
"Network: 192.0.2.0/24"
"Mask: ffffff00"
Пример
Разберем строку CIDR для IPv6-адреса:
package 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)
}
Результат выполнения кода:
"IP: 2001:db8::"
"Network: 2001:db8::/32"
"Mask: ffffffff000000000000000000000000"
Пример
Попробуем передать некорректную строку CIDR:
package 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)
}
Результат выполнения кода:
"Error: invalid CIDR address: 192.0.2.0/33"
Пример
Полученную сеть можно использовать для проверки принадлежности адреса:
package 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")
}
}
Результат выполнения кода:
"IP belongs to network"
Смотрите также
-
функцию
net.ParseIP,
которая разбирает IP-адрес в строковом представлении -
функцию
net.SplitHostPort,
которая разделяет адрес хоста и порта -
функцию
net.JoinHostPort,
которая объединяет хост и порт в один адрес -
тип
net.IPNet,
который представляет сеть с маской подсети