Что такое 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)
        }
    }
}

Ответ 18+ 🔞

А, слушай, смотри, IP-адрес, ёпта! Это типа как паспортный стол, только для твоего компа в интернете. Уникальный такой числовой ярлык, чтобы пакеты данных знали, куда им топать. Без него — нихуя не работает, пиздец.

Ну, версии, блядь:

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

А ещё они бывают разные, сука:

  • Публичные (белые): Как квартира с номером на весь дом — уникальные, в интернете видны всем.
  • Приватные (серые): Как комната в коммуналке. Только внутри своей локальной сети (192.168.0.5, например). На улицу, в интернет, с таким не выйдешь.
  • Специальные: Ну, типа 127.0.0.1 — это localhost, обращение самому к себе, любимому. А 0.0.0.0 — это типа «слушаю все двери, которые есть». Хитрая жопа, но полезная.

В Go с этим работать — одно удовольствие, блядь!

Пакет net — просто сказка. Главный тип там — net.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)
        }
    }
}

Вот и вся магия, блядь. ParseIP — он как умный швейцар: если видит адекватный адрес — пропускает, а если какую-то хуйню вроде not-an-ip — сразу говорит «иди нахуй», возвращает nil. А потом метод To4() смотрит — четвёрка это или шестёрка. Красота, в рот меня чих-пых!