You can’t remove a NaN key from a map without clearing it
Consider the following example code:
package main
import (
"fmt"
"math"
)
func main() {
m := map[float64]string{
1: "one",
math.NaN(): "not a number",
}
fmt.Println("Original: ", m)
delete(m, 1)
delete(m, math.NaN())
fmt.Println("After deleting: ", m)
}
It will output:
Original: map[NaN:not a number 1:one]
After deleting: map[NaN:not a number]
As you can see, the NaN value is not removed from the map.
Why?
NaN values are not equal to themselves, so the delete() function can’t find the key to remove it.
Solution
You can completely clear the map by calling the clear() built-in function that was introduced in go1.21.0, or alternatively you can build a new map by iterating the original one, and skipping the NaN keys by using the math.IsNaN() function:
Extra
A corollary of NaN keys not being equal to other NaN keys is that you can have as many NaN keys as you want:
package main
import (
"fmt"
"math"
)
func main() {
m := map[float64]string{
math.NaN(): "first",
math.NaN(): "second",
}
fmt.Println("Original: ", m)
m[math.NaN()] = "third"
fmt.Println("Modified: ", m)
}
Prints:
Original: map[NaN:second NaN:first]
Modified: map[NaN:third NaN:second NaN:first]