为啥端口是字符串而不是整数?
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
。不要把它们混为一谈。以上是关于为啥端口是字符串而不是整数?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 putchar、toupper、tolow 等采用 int 而不是 char?