同じことが何度も議論され、閉じられては再び開かれ、閉じられた後に新しいものが作成され、新しいものが禁止され、新しい議論が発見され、新しいものが作成されました。新しいものを開きます。これは職場では非常に一般的であり、Go の提案に関する議論にも現れます...
今日私が共有したいのは、Go マップの NaN と今後の API 増加の可能性をめぐる論争です。
コンピュータ サイエンスには、マジック 値は NaN (数値ではありません、数値ではありません) と呼ばれます。これは、未定義または表現不可能な値を表す数値データ型の値のクラスです。浮動小数点演算でよく使用されます。 NaN は、1985 年の IEEE 754 浮動小数点標準で初めて導入されました。
NaN 値を保存および比較するときに問題が発生します。なぜなら、値が NaN かどうかを判断する場合、x=NaN または x≠NaN で比較することはできないからです。ただし、NaN はそれ自身と等しくなることはないため、x=x または x≠x を判断することで、x が NaN 値であるかどうかを判断でき、それぞれ False と True が返されます。 NaN を別の浮動小数点数 x (x は通常の値、プラスまたはマイナスの無限大、または NaN にすることができます) と比較すると、比較結果は次のようになります。比较 | 结果 |
---|---|
NaN ≥ x | False |
NaN ≤ x | False |
NaN > x | False |
NaN < x | False |
NaN = x | False |
NaN ≠ x | True |
ここでの理解は、次のテスト問題にとって非常に重要です。
Go101 で IEEE-754 浮動小数点数に関する質問を見ました。ここでその質問を引用します。 、次のように、コードは何を出力しますか?
次のコード:
package main import "math" func main() { a, b, c := 2.0, 1.0, 0.0 x, y := a/c, b/c // infinity n := math.NaN() // not a number m := math.Sqrt(-1.0) // not a number println(x == y, m == n) }
しかし多くの議論の中で、公式 Go チームは解決策を次のように示しています:
for k := range m { delete(m, k) }しかし、これには落とし穴があります。
NaN キー値が含まれている場合、マップ
はループ削除によってクリアされません。マップに NaN が存在する場合、削除されたと思って再度削除すると、実際には削除されていなかったため、リークのような効果が発生します。 したがって、Go チームの魂である Russ Cox は、新しい提案「提案: 仕様: add delete(m) to clear map[1]#」を再度開始しました。 ##」。以下に示すように:
#これを使用して NaN のマップの問題を解決し、同時にマップのクリア/リセット/などのコミュニティの要求を完了したいと考えています。話題になった掃除。
つまり、次の機能が新たに追加されます。要約
この提案に関しては、邪悪な名前を付ける、削除と呼ぶべきかクリアと呼ぶべきかについてさまざまな意見があるなど、いくつかの声があります。
// Clear removes all entries from m, leaving it empty. func Clear[M ~map[K]V, K comparable, V any](m M "M ~map[K]V, K comparable, V any") delete(m)
也有声音提到不允许引入 NaN 值,但显然。在 Go1 已经很难了,因为 NaN 已经被允许引入,球已经在锅里了。
对于 map 新增 API 用于清空/重置/清除的作用,你怎么看呢?还是说你也更喜欢对 NaN 单独的处理?例如 panic?
以上がGo ボスは良心に気づき、マップをクリアするつもりですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。