例如,考虑这个IPv4 映射的 IPv6 地址:
::ffff:7f7f:7f7f
。在我测试过的所有浏览器的地址栏中提交 http://[::ffff:7f7f:7f7f]
时,格式都会保留:
netip
包(更具体地说,String
的netip.Addr
方法)通过以IPv4点十进制表示法写入其最低有效32位来格式化所讨论的地址,例如所以:::ffff:127.127.127.127
。
package main
import (
"fmt"
"log"
"net/netip"
)
func main() {
ip, err := netip.ParseAddr("::ffff:7f7f:7f7f")
if err != nil {
log.Fatal(err)
}
fmt.Println(ip) // ::ffff:127.127.127.127
}
(游乐场)
我需要复制浏览器地址栏格式 IPv4 映射的 IPv6 地址的方式。 有没有办法让
netip
格式化::ffff:7f7f:7f7f
,不是::ffff:127.127.127.127
,而是::ffff:7f7f:7f7f
?
首先,请记住,IPv4 映射的 IPv6 地址不允许在网络上使用,如 IANA IPv6 特殊用途地址注册表中所述,请注意,它们不能用作源地址或目标地址,不能用作转发或全局可路由,并且它们由 IP 本身保留它们不是实际的 IPv6 地址,只是 IPv6 格式的 IPv4 地址的表示形式,以便拥有公共地址存储,例如数据库。它们不应该在您的浏览器中工作。
net.IP
而不是 netip.Addr
,根据文档:
Addr.String()
:
请注意,与包 net 的 IP.String 方法不同,IPv4 映射的 IPv6 地址格式在点分四元组之前带有“::ffff:”前缀。
您可以使用ipaddress-go库,它可以生成各种字符串。免责声明:我是图书馆的项目经理。
addr := ipaddr.NewIPAddressString("::ffff:7f7f:7f7f").GetAddress()
addrStr := addr.String()
fmt.Println(addrStr)
mixedAddrStr, _ := addr.ToIPv6().ToMixedString()
fmt.Println(mixedAddrStr)
输出:
::ffff:7f7f:7f7f
::ffff:127.127.127.127