对于我正在开发的一个程序,我必须判断一个IP(将我连接到Internet的IP)是公共的还是私有的.为此,我需要区分IP是IPv4还是IPv6.

我想根据IP的长度进行判断:

conn, err := net.Dial("udp", "8.9.10.11:2342")
if err != nil {
    fmt.Println("Error", err)
}

localaddr := conn.LocalAddr()

addr, _ := net.ResolveUDPAddr("udp", localaddr.String())

ip := addr.IP

fmt.Println(ip)
fmt.Println(len(ip))

嗯,我的IP是192.168.2.100,也就是IPv4,但是len(Ip)告诉我长度是16,即IPv6. 我的错误是什么?是否有其他方法可以区分IPv4和IPv6,它们始终有效?

推荐答案

吉姆特的答案是正确的,但相当复杂.我只要查ip.To4() != nil就行了.由于文档显示"如果IP不是IPv4地址,TO4返回nil",当且仅当地址是IPv4地址时,此条件才应返回true.

Go相关问答推荐

语法-for循环中的initit陈述是否允许分配?

Kafka消费者在需要时不会暂停

如何预编译Golang标准库?

如何使用Gorilla WebSockets实现Http.Hijacker&;alexedwards/scs/v2

如何在VSCode中为特定的.go文件创建调试配置?

如何模拟go的Elastic search SDK?

如何找到一个空闲的TPM句柄来保存新的密钥对对象?

使用GOTK3和librsvg在Go中如何加载内联SVG?

将字符串格式的x509证书生成主题名称

如何使用 sync.WaitGroup 来执行所有的 goroutine?

如何在 `hashicorp / terraform-exec` 中将 `ApplyConfig` 传递给 `tf.Apply()`?

Gorm 预加载给出了模糊的列错误

将 .gz 文件添加到 tar.gz 文件,但在添加之前解码 gz.输出文件被剪辑(损坏)

对所有标志进行 ORing 的简短方法

如何使用 Status 字段创建 Kubernetes 对象?

如何在 golang 中同时加载 .env 文件和 os 环境变量

将未知长度切片的值分配给Go中的 struct ?

在 golang 中联合一个接口和类型

从 Go struct 中提取标签作为 reflect.Value

如何断言类型是指向golang中接口的指针