Go语言 为什么我不能比较网络地址?

iih3973s  于 2023-09-28  发布在  Go
关注(0)|答案(2)|浏览(97)

我试图理解/学习为什么我不能比较两个相同的net. Addr。
this post来看,如果两个接口具有相同的底层类型,并且该类型可以比较,则似乎应该能够比较它们。在下面的示例中,底层类型是net. UDPAddr。它是一个结构体,包含一个字符串、int和一个net.IP,后者是[]byte的类型别名。
是否因为切片IP不可比?即使它的类型,长度和内容都是一样的?
范例:
https://go.dev/play/p/dIzRCTwBA4P

w8f9ii69

w8f9ii691#

您的示例比较了两次调用net.ResolveUDPAddr返回的值。但是,如果考虑函数签名:
func ResolveUDPAddr(network,address string)(*UDPAddr,error)
你会注意到你实际上是在比较两个指针;它们是可比较的,但不会相等(您正在比较指针;而不是它所指向的值)。
根据go规范:
如果结构类型的所有字段类型都是可比较的,则结构类型也是可比较的。
切片、Map和函数类型不可比较。然而,作为特殊情况,切片、Map或函数值可以与预先声明的标识符nil进行比较。
net.UDPAddr包含一个net.IP,它是一个[]byte,因此不具有可比性。
This扩展您的示例可能会有所帮助。

r3i60tvu

r3i60tvu2#

您可以将IP地址的[]bytes表示(a1.IP)转换为string,然后直接与==进行比较,或者按照@jub0bs的建议使用slices.Equal

package main

import (
    "fmt"
    "net"
    "slices"
)

func main() {
    a1, _ := net.ResolveUDPAddr("udp", "192.168.0.1:1234")
    a2, _ := net.ResolveUDPAddr("udp", "192.168.0.1:1234")
    // we are casting []bytes to string
    ip1 := string(a1.IP.To4())
    ip2 := string(a2.IP.To4())
    // we are using slices package
    fmt.Println(slices.Equal(a1.IP, a2.IP))
    fmt.Println(ip1 == ip2)
}

Output:
true
true

源代码:Playground

相关问题