Go 如何确定给定的字符串是主机名还是IP地址

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

主机=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 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连接。