Что такое IP-адрес и как с ним работать в Go?

Ответ

IP-адрес (Internet Protocol Address) — это уникальный числовой идентификатор устройства (например, компьютера или сервера) в компьютерной сети, работающей по протоколу IP. Он используется для адресации и маршрутизации пакетов данных.

Основные версии:

  • IPv4: 32-битный адрес, записывается в виде четырех десятичных чисел от 0 до 255, разделенных точками (например, 8.8.8.8). Адресное пространство почти исчерпано.
  • IPv6: 128-битный адрес, решает проблему нехватки адресов IPv4. Записывается в виде восьми групп по четыре шестнадцатеричные цифры, разделенных двоеточиями (например, 2001:0db8:85a3:0000:0000:8a2e:0370:7334).

Типы адресов:

  • Публичные (белые): Глобально уникальные, маршрутизируются в интернете.
  • Приватные (серые): Используются в локальных сетях (например, 192.168.0.0/16, 10.0.0.0/8). Не маршрутизируются в интернете.
  • Специальные: Например, 127.0.0.1 (localhost) — адрес для обращения к своему же устройству, 0.0.0.0 — для прослушивания всех доступных сетевых интерфейсов.

Работа с IP-адресами в Go

Пакет net предоставляет мощные и удобные инструменты для работы с IP-адресами. Основной тип — net.IP.

Пример: парсинг и валидация IP-адреса

package main

import (
    "fmt"
    "net"
)

func main() {
    addrStrings := []string{"192.0.2.1", "2001:db8::68", "not-an-ip"}

    for _, addrStr := range addrStrings {
        ip := net.ParseIP(addrStr)
        if ip == nil {
            fmt.Printf("'%s' - это невалидный IP-адресn", addrStr)
            continue
        }

        if ip.To4() != nil {
            fmt.Printf("'%s' - это валидный IPv4 адресn", addrStr)
        } else {
            fmt.Printf("'%s' - это валидный IPv6 адресn", addrStr)
        }
    }
}