¿Por qué el puerto es una cadena y no un número entero?

103

El Portmétodo devuelve una cadena y no un número entero. ¿Cuál es la razón de esto? ¿Es seguro prefijar el puerto con ":"?

R3turnz
fuente

Respuestas:

143

Esto se debe a que lo que aparece después de los dos puntos puede ser un número de puerto o un nombre de servicio.

El siguiente es un ejemplo válido donde se usa el nombre del servicio en lugar de un número de puerto:

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

El mapeo de puertos para un servicio en particular se puede buscar usando net.LookupPort. En los sistemas Unix, el /etc/servicesarchivo se obtiene para las asignaciones.

Tim Cooper
fuente
1
Siempre me intriga la dicotomía de tipo abierto / tipo cerrado. Me gustaría ver algo así como un tipo mixto donde hay algunos valores predeterminados (aquí, por ejemplo, puertos y servicios conocidos) pero también permite extenderlos, en última instancia para admitir el autocompletado. En mi conocimiento de trabajo limitado, los ADT de TypeScripts se acercan más, tal vez los ADT de Swifts pueden expresar esto también directamente.
Stefan Hanke
0

Para un número, el valor predeterminado es 0: si una función

 func (u * URL) Port () string

devolver número en lugar de picar el puerto será 0

El puerto 0 es un puerto reservado en las redes TCP / IP, lo que significa que no debe usarse en mensajes TCP o UDP. Sin embargo, el puerto 0 tiene un significado especial en la programación de redes, particularmente en la programación de sockets Unix: para solicitar puertos dinámicos asignados por el sistema.

es una necesidad de programar en varias funciones

Fadid
fuente
En libGURL, url.port()devuelve una cadena ... pero GURL también proporciona url.has_port(). Entonces, teóricamente, podríamos distinguir http://example.com:/path(tiene un puerto, pero port()es una cadena vacía) de http://example.com/path(no tiene un puerto). ¡Por supuesto que GURL no hace esto! Incluso informa que http://example.com:80/path"no tiene un puerto", con el argumento de que el puerto especificado explícitamente es redundante con el esquema. Lo cual es una locura , pero no importa ... El punto es, Stringno es Optional. No los mezcle.
Quuxplusone