为何无法比较两个相同的net.Addr接口实例?
关于net.Addr接口实例无法比较的原因
对,就是因为net.IP本质是[]byte切片类型,而Go语言中切片属于不可比较类型——哪怕两个切片的类型、长度、内容完全一致,也不能直接用==运算符比较,这是语言本身的规则。
具体逻辑链:
net.UDPAddr结构体包含net.IP(切片别名)、Port(int)、Zone(string)三个字段,只要结构体中存在不可比较的字段,整个结构体就会被判定为不可比较类型。- 两个接口实例可比较的前提是:底层类型相同,且该底层类型本身可比较。现在
net.Addr的底层类型net.UDPAddr不可比较,所以直接用==比较两个net.Addr实例会触发panic。
解决办法:
如果需要判断两个UDP地址是否相等,得手动实现比较逻辑,示例代码如下:
import "bytes" import "net" func udpAddrEqual(a, b net.Addr) bool { udpA, okA := a.(*net.UDPAddr) udpB, okB := b.(*net.UDPAddr) if !okA || !okB { return false } if udpA == udpB { return true } if udpA == nil || udpB == nil { return false } return bytes.Equal(udpA.IP, udpB.IP) && udpA.Port == udpB.Port && udpA.Zone == udpB.Zone }
内容的提问来源于stack exchange,提问作者Ashley Duncan
相关产品推荐
相关产品推荐

