我遇到了一个Golang测验,它使用NaN作为 map 键,运行起来没有任何错误.如果map的键应该是可比较的,那么NaN是一个可比较的类型,还是这是一个允许将NaN作为键的编译器错误.

这是quiz sourcego playground link和下面的代码.

package main

var x = 0.0

func main() {
  var a = x / x // a = NaN
  var m = map[float64]int{a: 1}
  m[a] = 2
  for k := range m {
  delete(m, k)
  }
  println(len(m)) // prints 2
}

推荐答案

简而言之,这不是一个编译器错误.

贴图需要类似的types作为关键点.FLOAT(不管是Float32还是Float64)是comparable type.NaN的奇怪之处在于,虽然您可以比较两个NaN,但它们始终是不相等的.因此,当x为NaN时,某些浮点值x不等于其本身.这会带来惊喜.

Issue 20660条 comments 指出,同样的问题也出现在许多其他语言中.

I particularly like Russ Cox's comment that there are only bad answers here.

Go相关问答推荐

golang 的条件储存库

租户GUID X的租户不存在self 邮箱帐户的租户(我是唯一的成员)

如何用Golang解码这个嵌套的json?

正确使用pgtype的方法

Redis:尽管数据存在,但 rdb.Pipelined 中出现redis:nil错误

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

如何根据地址和大小打印字符串

这是实现超时的常见方法,为什么 time.After 不起作用

当我的 go build 成功时,如何修复我的 docker build 失败? Dockerfile 包括 go mod 下载

替换字符串中的最后一个字符

regex.ReplaceAll 但如果替换则添加相同数量的字符

使用 os/exec 和在命令行执行之间的结果莫名其妙地不同

整理时转换值

将 big.Int 转换为 [2]int64,反之亦然和二进制补码

将shell输出绑定到Go中的 struct 的最佳方法?

Golang模板无法访问embedFS中的文件

此代码如何生成内存对齐切片?

在 GORM 中,如何在特定时区配置 autoCreateTime 和 autoUpdateTime?

将 []float64 像素切片转换为图像

Go 加密库创建的 PKCS1 公钥与openssl rsa ...之间的区别