判断输入的字符串是否符合ip格式

以下代码不仅可用于ipv6,也同样适用于ipv4。

package mainimport ("net""fmt"
)func main() {//ipv4 := "12.56.30.88"ipv6 := "fe80::7526:a2ae:a0b8:946d"var p_ipv6 *string = &ipv6 //使用指针// ParseIP 这个方法 可以用来检查 ipv4/ipv6 地址是否正确,如果不正确,该方法返回 niladdress := net.ParseIP(*p_ipv6)if address == nil {fmt.Println("ipv6地址格式不正确")}else {fmt.Println("正确的ipv6地址-String:", address.String()) //返回格式stringfmt.Println("正确的ipv6地址-To4", address.To4())   //返回格式IPfmt.Println("正确的ipv6地址-To16", address.To16()) //返回格式IP}
}运行结果:
正确的ipv6地址-String: fe80::7526:a2ae:a0b8:946d
正确的ipv6地址-To4 <nil>
正确的ipv6地址-To16 fe80::7526:a2ae:a0b8:946d

ipv4相关

package mainimport ("net""fmt"
)const (EtherAddrLen = 6IPv4AddrLen  = 4IPv6AddrLen  = 16
)type IPv4Address uint32func IntIPv4ToString(ip uint32) string {return fmt.Sprintf("%d.%d.%d.%d",byte(ip), byte(ip>>8), byte(ip>>16), byte(ip>>24))
}func BytesToIPv4(a byte, b byte, c byte, d byte) IPv4Address {return IPv4Address(d)<<24 | IPv4Address(c)<<16 | IPv4Address(b)<<8 | IPv4Address(a)
}func IPv4ToBytes(v IPv4Address) [IPv4AddrLen]byte {return [IPv4AddrLen]uint8{byte(v), byte(v >> 8), byte(v >> 16), byte(v >> 24)}
}func main() {//格式处理fmt.Println("bytes to unit32 IPv4:", BytesToIPv4(12, 56, 30, 88)) //输出:1478375436fmt.Println("unit32 IPv4 to bytes:", IPv4ToBytes(BytesToIPv4(12, 56, 30, 88)))fmt.Println("解析uint32的ip地址", IntIPv4ToString(1478375436))fmt.Println("ipv4地址", net.IPv4(127, 0, 1, 2)) //IP
}运行结果:
bytes to unit32 IPv4: 1478375436
unit32 IPv4 to bytes: [12 56 30 88]
解析uint32的ip地址 12.56.30.88
ipv4地址 127.0.1.2

ipv6相关

const (IPv6AddrLen  = 16
)
type IPv6Address [IPv6AddrLen]uint8func (addr IPv6Address) String() string {return fmt.Sprintf("[%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x]",addr[0], addr[1], addr[2], addr[3],addr[4], addr[5], addr[6], addr[7],addr[8], addr[9], addr[10], addr[11],addr[12], addr[13], addr[14], addr[15])
}

域名解析相关

package mainimport ("net""fmt"
)func DomainNameToIP() {//域名domain := "www.baidu.com"ipAddr, err := net.ResolveIPAddr("ip", domain)if err != nil {fmt.Printf("Err: %s", err.Error())return}fmt.Printf("获取的IP:%s\n", ipAddr.String())fmt.Printf("IP: %s Network: %s Zone: %s\n", ipAddr.IP, ipAddr.Network(), ipAddr.Zone)// 百度,虽然只有一个域名,但实际上,他对应电信,网通,联通等又有多个IP地址ns, err := net.LookupHost(domain)if err != nil {fmt.Printf("Err: %s", err.Error())return}fmt.Printf("获取的多个服务器的IP:\n")for _, n := range ns {fmt.Printf("%s\n", n) // 打开百度的地址}
}func main() {DomainNameToIP()
}运行结果:
获取的IP:39.156.66.14
IP: 39.156.66.14 Network: ip Zone:
获取的多个服务器的IP:
39.156.66.14
39.156.66.18