go - 为什么 Go net.IPv4 会在内部创建一个 16 字节的地址

标签 go

我注意到 Go 在使用时创建了一个 4 字节 IPv4 地址的 16 字节内部表示:

// 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
}

https://golang.org/src/net/ip.go

IPv4 最初创建时有 16 个字节是有原因的吗?我正在为 Broadcast 和 Networkaddress 做一些计算,我直接访问了内部 byte[] 并且很困惑我必须调用 To4() 来做类似的事情

start := binary.BigEndian.Uint32([]byte(ip))

并实际获取 IPv4 地址作为 uint32。

最佳答案

看起来他们使用的表示法允许他们使用相同的代码轻松处理 IPv4 和 IPv6 地址。他们对任一类型的 IP 使用单一的 16 字节表示。

代码顶部的注释(您链接到的)解释得很清楚:

// IPv4 addresses are 4 bytes; IPv6 addresses are 16 bytes.
// An IPv4 address can be converted to an IPv6 address by
// adding a canonical prefix (10 zeros, 2 0xFFs).
// This library accepts either size of byte slice but always
// returns 16-byte addresses.

您可以传入 4 字节或 16 字节的 IPv4 地址表示,但该库将在内部使用 16 字节的地址并始终返回它们。

关于go - 为什么 Go net.IPv4 会在内部创建一个 16 字节的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49141513/

相关文章:

go - Go Gin框架登录JSON

bash - 从带有空格的脚本导出环境变量

go - 动态初始化结构

arrays - Golang问题数组数独-网格[i] [j] [0]

c++ - 在 C++ 中使用枚举编程 iota 相似性

go - ioutil.ReadAll 为 tar 阅读器提供 0 个字节

mongodb - 在上下文中使用 mgo

html - 如何在 Hugo 模板中将值列表转换为逗号分隔的字符串

go - 获取 websocket session

go - 为什么 p 不满足 c 的接口(interface)(第 106 行)?