Go 如何确定给定的字符串是主机名还是IP地址
主机=sealinuxvm11时,我得到Go 如何确定给定的字符串是主机名还是IP地址,go,Go,主机=sealinuxvm11时,我得到 _, err := strconv.ParseInt(host, 10, 64) if err == nil { hp.IpAddress = host } else { hp.HostName = dbhost } 主机=192.168.24.10时 error strconv.ParseInt: parsing " sealinuxvm11 ": invalid synta
_, err := strconv.ParseInt(host, 10, 64)
if err == nil {
hp.IpAddress = host
} else {
hp.HostName = dbhost
}
主机=192.168.24.10时
error strconv.ParseInt: parsing " sealinuxvm11 ": invalid syntax
IP地址应解析为字符串。我使用net包的ParseIP来确定给定字符串是IP还是主机
strrconv.ParseInt: parsing " 192.168.24.10": invalid syntax
但是,这可能会将主机名设置为无效值。如果net.ParseIP
返回错误,请检查以确保主机名是有效的主机名。将使用
addr := net.ParseIP(host)
if addr != nil {
hp.IPAddress = host
} else {
hp.HostName = host
}
确定主机名是否有效
正如评论中指出的那样,确定主机名是否有效肯定有更好更快的方法。我建议您研究一下如何实现这一点应该将IP地址解析为字符串。我使用net包的ParseIP来确定给定字符串是IP还是主机
strrconv.ParseInt: parsing " 192.168.24.10": invalid syntax
但是,这可能会将主机名设置为无效值。如果net.ParseIP
返回错误,请检查以确保主机名是有效的主机名。将使用
addr := net.ParseIP(host)
if addr != nil {
hp.IPAddress = host
} else {
hp.HostName = host
}
确定主机名是否有效
正如评论中指出的那样,确定主机名是否有效肯定有更好更快的方法。我建议您对如何实现这一点进行一些研究我建议不要使用
net.LookupHost()
进行验证:此函数不是纯粹的:它有潜在的广泛副作用(想象一下在一个紧密的循环中检查100000个主机名的有效性)。事实上,检查主机名是否有效很简单(一个字符一个字符的迭代器与一个smlple状态机相结合;我认为它将少于100行代码)。前者定义了主机名的以下语法::=*[“]
和:=[*[]]
加上支持主机名长度从63到255个八位字节的大小要求。我想说,为上述两个规则实现解析器并不难。ip地址不是有效的主机名吗?为什么名称
中的第一个字符必须是
?@brianSan一个IP地址是一个表示可在TCP/IP层中使用的逻辑网络位置标签。然而,主机名始终必须从DNS服务器解析为IP才能建立IP连接。我建议不要使用net.LookupHost()
进行验证:此功能不是纯粹的:它有潜在的广泛副作用(想象一下在一个紧密循环中检查100000个主机名的有效性)。事实上,检查主机名是否有效很简单(一个字符一个字符的迭代器与一个smlple状态机相结合;我认为它将少于100行代码)。前者定义了主机名的以下语法::=*[“]
和:=[*[]]
加上支持主机名长度从63到255个八位字节的大小要求。我想说,为上述两个规则实现解析器并不难。ip地址不是有效的主机名吗?为什么名称
中的第一个字符必须是
?@brianSan一个IP地址是一个表示可在TCP/IP层中使用的逻辑网络位置标签。然而,主机名始终必须从DNS服务器解析为IP才能建立IP连接。