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/services
file 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 è, String
non lo è Optional
. Non confonderli.