我试图理解/学习为什么我不能比较两个相同的net. Addr。
从this post来看,如果两个接口具有相同的底层类型,并且该类型可以比较,则似乎应该能够比较它们。在下面的示例中,底层类型是net. UDPAddr。它是一个结构体,包含一个字符串、int和一个net.IP,后者是[]byte的类型别名。
是否因为切片IP不可比?即使它的类型,长度和内容都是一样的?
范例:
https://go.dev/play/p/dIzRCTwBA4P
我试图理解/学习为什么我不能比较两个相同的net. Addr。
从this post来看,如果两个接口具有相同的底层类型,并且该类型可以比较,则似乎应该能够比较它们。在下面的示例中,底层类型是net. UDPAddr。它是一个结构体,包含一个字符串、int和一个net.IP,后者是[]byte的类型别名。
是否因为切片IP不可比?即使它的类型,长度和内容都是一样的?
范例:
https://go.dev/play/p/dIzRCTwBA4P
2条答案
按热度按时间w8f9ii691#
您的示例比较了两次调用
net.ResolveUDPAddr
返回的值。但是,如果考虑函数签名:func ResolveUDPAddr(network,address string)(*UDPAddr,error)
你会注意到你实际上是在比较两个指针;它们是可比较的,但不会相等(您正在比较指针;而不是它所指向的值)。
根据go规范:
如果结构类型的所有字段类型都是可比较的,则结构类型也是可比较的。
切片、Map和函数类型不可比较。然而,作为特殊情况,切片、Map或函数值可以与预先声明的标识符nil进行比较。
net.UDPAddr包含一个
net.IP
,它是一个[]byte
,因此不具有可比性。This扩展您的示例可能会有所帮助。
r3i60tvu2#
您可以将IP地址的
[]bytes
表示(a1.IP
)转换为string
,然后直接与==
进行比较,或者按照@jub0bs的建议使用slices.Equal
。源代码:Playground