go语言中的IP长度

平山居士 · · 459 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:平山居士

查看原文:go语言中的IP长度

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

459 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传