听"0.0.0.0:80"和":80"有什么区别?

Pat*_*ryk 4 port http go

当我们使用时http.ListenAndServe,有什么区别:

http.ListenAndServe("0.0.0.0:80", nil)
Run Code Online (Sandbox Code Playgroud)

http.ListenAndServe(":80", nil)
Run Code Online (Sandbox Code Playgroud)

?两个版本都不会监听端口上的所有接口80吗?

Emi*_*l H 6

http.ListenAndServe()函数最终调用net.Listen().net.Listen它将绑定到提供给它的网络的状态的文档:

对于TCP网络,如果address参数中的主机为空或文本未指定的IP地址,则Listen将侦听本地系统的所有可用单播和任播IP地址.要仅使用IPv4,请使用网络"tcp4".

但是,查看源代码http.ListenAndServe()我们可以看到它指定"tcp"为网络而不是"tcp4".因此,示例代码中的调用应该导致相同的行为,即两个调用都应该绑定到所有可用的接口.然而,进一步挖掘golang源代码我们最终会进入internetAddrList(),我们可以看到它区分了一个空host值和一个指定了ipv4地址的值.因此golang确实将指定的ipv4地址视为仅在该接口上绑定的指示.