Чому порт - це рядок, а не ціле число?


103

PortМетод повертає рядок , а не ціле число. У чому причина цього і чи безпечно префіксувати порт ":"?

Відповіді:


143

Це тому, що те, що з’являється після двокрапки, може бути або номером порту, або назвою послуги.

Далі наведено дійсний приклад, коли замість номера порту використовується ім’я служби:

listener, err := net.Listen("tcp", "localhost:https") // port 443
// ...

Зображення портів для певної послуги можна переглянути за допомогою net.LookupPort. У системах Unix /etc/servicesфайл збирається для відображень.


1
Мене завжди заінтригує дихотомія відкритого типу / закритого типу. Мені хотілося б побачити щось на зразок змішаного типу, де є деякі за замовчуванням (тут, наприклад, відомі порти та сервіси), але також дозволяє розширити їх, в кінцевому рахунку для підтримки автодоповнення. За моїми обмеженими робочими знаннями TypeScripts ADTs наближаються, можливо, Swifts ADTs може це також виразити безпосередньо.
Стефан Ханке

0

Для числа значення за замовчуванням дорівнює 0: якщо функція

 func (u * URL) Port () string

зворотний номер замість жадання порту буде 0

Порт 0 є зарезервованим портом у мережі TCP / IP, що означає, що він не повинен використовуватися в повідомленнях TCP або UDP. Однак порт 0 має особливе значення в мережевому програмуванні, зокрема програмуванні сокетів Unix: для запиту системних, динамічних портів.

це потреба в програмуванні на кілька функцій


У libGURL url.port()повертає рядок ... але GURL також надає url.has_port(). Тож теоретично ми могли б відрізнити http://example.com:/path(має порт, але port()порожній рядок) від http://example.com/path(не має порту). Звичайно, сам GURL цього не робить! Він навіть повідомляє, що http://example.com:80/path"не має порту", виходячи з того, що чітко вказаний порт є зайвим у цій схемі. Що божевільно , але неважливо ... Справа в тому, що Stringце не так Optional. Не плутайте їх.
Quuxplusone
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.