Dlaczego port jest łańcuchem znaków, a nie liczbą całkowitą?

103

PortMetoda zwraca ciąg znaków, a nie całkowitą. Jaki jest tego powód i czy można bezpiecznie przedrostek portu „:”?

R3turnz
źródło

Odpowiedzi:

143

Dzieje się tak, ponieważ to, co pojawia się po dwukropku, może być numerem portu lub nazwą usługi.

Poniżej znajduje się prawidłowy przykład, w którym zamiast numeru portu używana jest nazwa usługi:

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

Mapowanie portów dla określonej usługi można sprawdzić za pomocą net.LookupPort. W systemach uniksowych /etc/servicesplik jest pobierany na potrzeby mapowań.

Tim Cooper
źródło
1
Zawsze intryguje mnie dychotomia typu otwartego / zamkniętego. Chciałbym zobaczyć coś w rodzaju mieszanego typu, w którym są pewne wartości domyślne (tutaj np. Dobrze znane porty i usługi), ale także pozwala je rozszerzyć, ostatecznie aby wspierać autouzupełnianie. W mojej ograniczonej wiedzy praktycznej TypeScripts ADT są najbliższe, być może jerzyki ADT mogą to również wyrazić bezpośrednio.
Stefan Hanke
0

Dla liczby domyślną wartością jest 0: jeśli funkcja

 func (u * URL) Port () string

zwracany numer zamiast żądać portu będzie wynosił 0

Port 0 jest zarezerwowanym portem w sieci TCP / IP, co oznacza, że ​​nie powinien być używany w komunikatach TCP lub UDP. Jednak port 0 ma szczególne znaczenie w programowaniu sieciowym, zwłaszcza w programowaniu za pomocą gniazd Unix: do żądania przydzielonych przez system portów dynamicznych.

Konieczne jest zaprogramowanie kilku funkcji

Fadid
źródło
W libGURL url.port()zwraca ciąg znaków ... ale GURL zapewnia również url.has_port(). Więc teoretycznie moglibyśmy odróżnić http://example.com:/path(ma port, ale port()jest pustym łańcuchem) od http://example.com/path(nie ma portu). Oczywiście sam GURL tego nie robi! Zgłasza nawet, że http://example.com:80/path„nie ma portu”, ponieważ wyraźnie określony port jest nadmiarowy w schemacie. Co jest szalone , ale nieważne ... Nie chodzi o Stringto Optional. Nie łącz ich.
Quuxplusone