Por que a porta é uma string e não um inteiro?

103

O Portmétodo retorna uma string e não um inteiro. Qual é a razão para isso e é seguro prefixar a porta com ":"?

R3turnz
fonte

Respostas:

143

Isso ocorre porque o que aparece após os dois pontos pode ser um número de porta ou nome de serviço.

A seguir está um exemplo válido em que o nome do serviço é usado em vez de um número de porta:

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

O mapeamento de porta para um serviço específico pode ser pesquisado usando net.LookupPort. Em sistemas Unix, o /etc/servicesarquivo é originado dos mapeamentos.

Tim Cooper
fonte
1
Sempre fico intrigado com a dicotomia tipo aberto / tipo fechado. Eu gostaria de ver algo como um tipo misto onde existem alguns padrões (aqui, por exemplo, portas e serviços conhecidos), mas também permite estendê-los, em última análise, para suportar o preenchimento automático. No meu conhecimento de trabalho limitado, os TypeScripts ADTs chegam mais perto, talvez os Swifts ADTs possam expressar isso também diretamente.
Stefan Hanke
0

Para um número, o valor padrão é 0: se uma função

 func (u * URL) Port () string

número de retorno em vez de sting a porta será 0

A porta 0 é uma porta reservada na rede TCP / IP, o que significa que não deve ser usada em mensagens TCP ou UDP. No entanto, a porta 0 tem um significado especial na programação de rede, particularmente na programação de soquete Unix: para solicitar portas dinâmicas alocadas pelo sistema.

é uma necessidade de programação em várias funções

Fadid
fonte
Em libGURL, url.port()retorna uma string ... mas GURL também fornece url.has_port(). Então, teoricamente, poderíamos distinguir http://example.com:/path(tem uma porta, mas port()é uma string vazia) de http://example.com/path(não tem uma porta). Claro que o próprio GURL não faz isso! Ele ainda informa que http://example.com:80/path"não tem uma porta", alegando que a porta explicitamente especificada é redundante com o esquema. O que é loucura , mas não importa ... A questão é, Stringnão é Optional. Não os confunda.
Quuxplusone