Risposte:
Questo perché ciò che appare dopo i due punti può essere un numero di porta o un nome di servizio.
Quello che segue è un esempio valido in cui viene utilizzato il nome del servizio anziché un numero di porta:
listener, err := net.Listen("tcp", "localhost:https") // port 443
// ...
La mappatura delle porte per un particolare servizio può essere ricercata utilizzando net.LookupPort. Sui sistemi Unix, il /etc/servicesfile viene originato per le mappature.
Per un numero il valore predefinito è 0: se una funzione
func (u * URL) Port () string
il numero di ritorno invece di sting la porta sarà 0
La porta 0 è una porta riservata nella rete TCP / IP, il che significa che non dovrebbe essere utilizzata nei messaggi TCP o UDP. Tuttavia, la porta 0 ha un significato speciale nella programmazione di rete, in particolare nella programmazione dei socket Unix: per la richiesta di porte dinamiche allocate dal sistema.
è una necessità di programmazione in parecchie funzioni
url.port()restituisce una stringa ... ma fornisce anche GURL url.has_port(). Quindi teoricamente potremmo distinguere http://example.com:/path(ha una porta, ma port()è una stringa vuota) da http://example.com/path(non ha una porta). Ovviamente GURL stesso non lo fa! Segnala persino che http://example.com:80/path"non ha una porta", sulla base del fatto che la porta specificata esplicitamente è ridondante con lo schema. Il che è pazzesco , ma non importa ... Il punto è, Stringnon lo è Optional. Non confonderli.