为啥端口是字符串而不是整数?

Posted

技术标签:

【中文标题】为啥端口是字符串而不是整数?【英文标题】:Why is port a string and not an integer?为什么端口是字符串而不是整数? 【发布时间】:2018-06-08 02:47:21 【问题描述】:

Port 方法返回一个字符串而不是整数。这是什么原因?在端口前加上“:”是否安全?

【问题讨论】:

【参考方案1】:

这是因为冒号后面的内容可以是端口号或服务名称。

以下是使用服务名称而不是端口号的有效示例:

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

可以使用net.LookupPort 查找特定服务的端口映射。在 Unix 系统上,/etc/services 文件用于映射。

【讨论】:

我总是对开放式/封闭式二分法很感兴趣。我希望看到类似 mixed 类型的东西,其中有一些默认值(例如,众所周知的端口和服务),但也允许扩展它们,最终支持自动完成。在我有限的工作知识中,TypeScripts ADTs 最接近,也许 Swifts ADTs 也可以直接表达这一点。【参考方案2】:

对于数字,默认值为 0:如果是函数

 func (u * URL) Port () string

返回数字而不是端口将是 0

端口 0 是 TCP/IP 网络中的保留端口,这意味着不应在 TCP 或 UDP 消息中使用它。然而,端口 0 在网络编程中具有特殊的意义,尤其是 Unix 套接字编程:用于请求系统分配的动态端口。

需要在多个函数中进行编程

【讨论】:

在 libGURL 中,url.port() 返回一个字符串……但 GURL 也提供了url.has_port()。所以理论上我们可以区分http://example.com:/path(有端口,但port()是空字符串)和http://example.com/path(没有端口)。当然 GURL 本身不会这样做!它甚至报告http://example.com:80/path“没有端口”,理由是明确指定的端口与该方案是多余的。这是crazy,但没关系...重点是,String 不是Optional。不要把它们混为一谈。

以上是关于为啥端口是字符串而不是整数?的主要内容,如果未能解决你的问题,请参考以下文章

一个整数而不是字符串?为啥? [复制]

为啥 Python 返回整数而不是字符串 [关闭]

为啥 putchar、toupper、tolow 等采用 int 而不是 char?

为啥使用整数而不是长整数?

为啥 Spring Boot 返回一个字符串而不是 JSON

为啥 Hex() 函数返回一个字符串而不是一个 int hex?