IP类型的长度
在net包中有两种ip地址的长度常量,可以看到ipv4和ipv6两种ip地址,长度是不一样的
// IP address lengths (bytes).
const (
IPv4len = 4
IPv6len = 16
)
但是如果用到golang的net.IP的话,就算是ipv4的地址,IP的长度也可能和ipv6的一样,如下面的代码
ip := net.ParseIP("192.168.2.145");
log.Printf("%v,len %d\n",ip,len(ip)) // 192.168.2.145,len 16
这是为什么呢?答案就在net.IPv4方法中,因为最后会调用到此方法,下面就是截取出来的方法实现代码,可以看到就算是ipv4的地址类型,也会在make切片时传入ipv6的长度
// IPv4 returns the IP address (in 16-byte form) of the
// IPv4 address a.b.c.d.
func IPv4(a, b, c, d byte) IP {
p := make(IP, IPv6len)
copy(p, v4InV6Prefix)
p[12] = a
p[13] = b
p[14] = c
p[15] = d
return p
}
解决办法
如果想要ipv4地址的长度符合实际ip地址类型的话,还需要调用net.To4方法,此时如果ip是ipv4类型的地址的话,长度就只有4了,如果不是ipv4类型的地址,那么返回的ip为nil
有疑问加站长微信联系(非本文作者)