我在试着理解/学习为什么我不能比较两个相同的网络.

this post开始,如果两个接口属于相同的底层类型,并且该类型可以进行比较,则它们应该能够进行比较.在下面的示例中,基础类型是net.UDPAddr.它是一个包含字符串int和net.IP的 struct ,net.IP是[]byte的类型别名.

是不是因为分片IP不可比?即使它的类型、长度和内容都是相同的?

示例:

https://go.dev/play/p/dIzRCTwBA4P

推荐答案

您的示例将两次调用返回的值与net.ResolveUDPAddr进行比较.但是,如果您考虑函数签名:

Func ResolveUDPAddr(网络,地址字符串)(*UDPAddr,Error)

您将注意到,您实际上是在比较两个指针;这两个指针是可比较的,但不会相等(您是在比较指针,而不是它所指向的值).

根据前go spec名:

Struct types are comparable if all their field types are comparable.
Slice, map, and function types are not comparable. However, as a special case, a slice, map, or function value may be compared to the predeclared identifier nil.

net.UDPAddr包含net.IP,而net.IP[]byte,因此不可比较.

把你的例子推广到This点可能会有帮助.

Go相关问答推荐

GO框架Echo中间件的使用

使用!NOT运算符的Golang文本/模板多个条件

无法获取RPC描述符

如何解析Go-Gin多部分请求中的 struct 切片

Golang Gorm Fiber / argon2.Config 未定义

如何绕过深层 xml,没有嵌套循环?

Go 中如何判断 struct 体是否包含另一个 struct 体?

是否可以将 http.ServeHttp 包装在 go 中以使用 alexedwards/scs/v2 添加会话

Caddy服务器try 打开端口80而不是8090.

Go 中的 Azure JWT 验证不起作用

如何使用带有方法的字符串枚举作为通用参数?

fmt.Printf() 标志 '0' 不会被字符串忽略

GRPC 元数据未在 Go 中更新

处理程序后访问 HTTP 请求上下文

如何使用 math/big 对 bigInt 进行取模?

在 Raspberry Pi4 上下载 Go Mod

如何在Golang中的差异函数中杀死命令Exec

如何获取多个 url 参数值

如何在测试中传递用户名和密码等参数

Go:为一组单个结果实现 ManyDecode