ホームページ >バックエンド開発 >Golang >Go ボスは良心に気づき、マップをクリアするつもりですか?

Go ボスは良心に気づき、マップをクリアするつもりですか?

Golang菜鸟
Golang菜鸟転載
2023-08-04 17:20:33683ブラウズ


同じことが何度も議論され、閉じられては再び開かれ、閉じられた後に新しいものが作成され、新しいものが禁止され、新しい議論が発見され、新しいものが作成されました。新しいものを開きます。これは職場では非常に一般的であり、Go の提案に関する議論にも現れます...

今日私が共有したいのは、Go マップの NaN と今後の API 増加の可能性をめぐる論争です。

背景質問とテストの質問

NaN とは

コンピュータ サイエンスには、マジック 値は 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

ここでの理解は、次のテスト問題にとって非常に重要です。

Go IEEE-754 試験質問

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)
}
  • A: true true。
  • #B: 真偽。
  • C: 偽偽。
  • D: false true。 ############答えはなんですか? AですかDですか?
    上記のプログラムを分析すると、変数 x と y は Inf 正の無限大です。 m、n は NaN 無限値です。
正解は「B」です。

答えは正解でしたか?

提案

NaN の基本を理解したら、正式にトピックに入ります。 Go マップ関連付けの提案では、マップをクリアするという要求を満たすための新しい API がよく言及されます:

しかし多くの議論の中で、公式 Go チームは解決策を次のように示しています:

for k := range m {
    delete(m, k)
}
と関連する提案を閉じ、この問題は終了しました。私たち労働者にとっては「これでいけるのではないか」という疑問が残るのが、このような提案の背景です。 Go ボスは良心に気づき、マップをクリアするつもりですか?
しかし、これには落とし穴があります。

NaN キー値が含まれている場合、マップ

はループ削除によってクリアされません。マップに NaN が存在する場合、削除されたと思って再度削除すると、実際には削除されていなかったため、リークのような効果が発生します。

したがって、Go チームの魂である Russ Cox は、新しい提案「

提案: 仕様: add delete(m) to clear map[1]#」を再度開始しました。 ##」。以下に示すように:

#これを使用して NaN のマップの問題を解決し、同時にマップのクリア/リセット/などのコミュニティの要求を完了したいと考えています。話題になった掃除。

つまり、次の機能が新たに追加されます。
delete(m)
Go ボスは良心に気づき、マップをクリアするつもりですか? マップを (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 已经被允许引入,球已经在锅里了。

Go ボスは良心に気づき、マップをクリアするつもりですか?

对于 map 新增 API 用于清空/重置/清除的作用,你怎么看呢?还是说你也更喜欢对 NaN 单独的处理?例如 panic?

以上がGo ボスは良心に気づき、マップをクリアするつもりですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はGolang菜鸟で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。