Inhaltsverzeichnis
Vorschlag" >Vorschlag
Zusammenfassung" >Zusammenfassung
Heim Backend-Entwicklung Golang Go Boss erkennt sein Gewissen und ist bereit, die Karte zu räumen?

Go Boss erkennt sein Gewissen und ist bereit, die Karte zu räumen?

Aug 04, 2023 pm 05:20 PM
go


Eine Sache wurde hin und her besprochen, geschlossen und wieder geöffnet, nach der Schließung wurde eine neue gebaut, die neue verboten, neue Argumente entdeckt und wieder neue eröffnet. Das kommt am Arbeitsplatz sehr häufig vor und kommt auch in Go-Vorschlagsdiskussionen vor ...

Was ich heute mitteilen möchte, ist eine Kontroverse über NaN in der Go-Karte und die mögliche bevorstehende API-Erweiterung.

Hintergrund- und Testfragen

Was ist NaN?

In der Informatik gibt es einen magischen Wert namens: NaN (Not a Number, non-number). Es handelt sich um eine Werteklasse vom numerischen Datentyp, die undefinierte oder nicht darstellbare Werte darstellt . Wird häufig bei Gleitkommaoperationen verwendet. NaN wurde erstmals 1985 im Gleitkommastandard IEEE 754 eingeführt.

Beim Speichern und Vergleichen mit NaN-Werten wird es Probleme geben. Denn bei der Beurteilung, ob ein Wert NaN ist, kann der Vergleich nicht durch die Beurteilung von x=NaN oder x≠NaN durchgeführt werden. Da NaN jedoch niemals sich selbst entspricht, können Sie beurteilen, ob x ein NaN-Wert ist, indem Sie x=x oder x≠x beurteilen, was jeweils „False“ und „True“ zurückgibt.

Wenn NaN mit einer anderen Gleitkommazahl x verglichen wird (wobei x ein normaler Wert plus oder minus unendlich oder NaN sein kann), ist das Vergleichsergebnis wie folgt:

Vergleichen Ergebnis
NaN ≥ x Falsch
NaN ≤. x Falsch
NaN &g t; x False
NaN < x False
NaN = x False
NaN ≠ x True

Das Verständnis hier ist für die folgenden Testfragen sehr wichtig.

Go IEEE-754-Prüfungsfragen

Ich habe eine Frage zu IEEE-754-Gleitkommazahlen auf Go101 gesehen. Was gibt der folgende Code aus?

Der folgende Code:

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)
}
Nach dem Login kopieren
  • A: wahr wahr.
  • B: wahr falsch.
  • C: falsch falsch.
  • D: falsch wahr.

Was ist die Antwort? Ist es A oder D?

Bei der Analyse des obigen Programms sind die Variablen x und y +Inf und positiv unendlich. m, n sind NaN unendliche Werte.

Die richtige Antwort ist: B.

Hast du richtig geantwortet?

Vorschlag

Nachdem wir ein grundlegendes Verständnis von NaN haben, können wir offiziell in das Thema einsteigen. In Vorschlägen für Go-Karten werden oft neue APIs erwähnt, um den Anforderungen des Löschens der Karte gerecht zu werden:

Go Boss erkennt sein Gewissen und ist bereit, die Karte zu räumen?

Aber nach vielen Diskussionen lautete die Lösung des offiziellen Go-Teams:

for k := range m {
    delete(m, k)
}
Nach dem Login kopieren

und geschlossene verwandte Vorschläge haben dieses Problem geschlossen . Uns, den Arbeitern, bleiben Zweifel im Gesicht wie „Okay, das wird funktionieren.“ Das ist der Hintergrund für diese Art von Vorschlag.

Aber hier gibt es eine Gefahr Wenn sie einen NaN-Schlüsselwert enthält, wird die Karte nicht durch eine Löschschleife gelöscht . Sobald Ihre Karte NaN enthält, Sie aber erneut löschen und denken, dass es gelöscht wurde, dies aber in Wirklichkeit nicht der Fall ist, führt dies zu einem Effekt, der einem Leck ähnelt.

Also hat Russ Cox, die Seele des Go-Teams, einen neuen Vorschlag neu initiiert: „Vorschlag: spec: delete(m) zur Clear Map hinzufügen[1]“. Wie unten gezeigt:

Go Boss erkennt sein Gewissen und ist bereit, die Karte zu räumen?

Ich hoffe, damit das Kartenproblem in NaN lösen zu können und gleichzeitig die besprochenen Community-Anforderungen wie das Löschen/Zurücksetzen/Bereinigen von Karten zu erfüllen.

Die folgenden Funktionen wurden neu hinzugefügt:

delete(m)
Nach dem Login kopieren

Unterstützt die Funktion zum Löschen der Karte (auch wenn sie NaN enthält).

Zusammenfassung

Zu diesem Vorschlag gibt es mehrere Meinungen, unter anderem wird ihm ein böser Name gegeben und es gibt unterschiedliche Meinungen darüber, ob er „löschen“ oder „klar“ heißen sollte.

// 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)
Nach dem Login kopieren

也有声音提到不允许引入 NaN 值,但显然。在 Go1 已经很难了,因为 NaN 已经被允许引入,球已经在锅里了。

Go Boss erkennt sein Gewissen und ist bereit, die Karte zu räumen?

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

Das obige ist der detaillierte Inhalt vonGo Boss erkennt sein Gewissen und ist bereit, die Karte zu räumen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Wie sende ich Go WebSocket-Nachrichten? Wie sende ich Go WebSocket-Nachrichten? Jun 03, 2024 pm 04:53 PM

In Go können WebSocket-Nachrichten mit dem Paket gorilla/websocket gesendet werden. Konkrete Schritte: Stellen Sie eine WebSocket-Verbindung her. Senden Sie eine Textnachricht: Rufen Sie WriteMessage(websocket.TextMessage,[]byte("message")) auf. Senden Sie eine binäre Nachricht: Rufen Sie WriteMessage(websocket.BinaryMessage,[]byte{1,2,3}) auf.

Vertiefendes Verständnis des Golang-Funktionslebenszyklus und des Variablenumfangs Vertiefendes Verständnis des Golang-Funktionslebenszyklus und des Variablenumfangs Apr 19, 2024 am 11:42 AM

In Go umfasst der Funktionslebenszyklus Definition, Laden, Verknüpfen, Initialisieren, Aufrufen und Zurückgeben; der Variablenbereich ist in Funktionsebene und Blockebene unterteilt. Variablen innerhalb einer Funktion sind intern sichtbar, während Variablen innerhalb eines Blocks nur innerhalb des Blocks sichtbar sind .

Wie kann ich Zeitstempel mithilfe regulärer Ausdrücke in Go abgleichen? Wie kann ich Zeitstempel mithilfe regulärer Ausdrücke in Go abgleichen? Jun 02, 2024 am 09:00 AM

In Go können Sie reguläre Ausdrücke verwenden, um Zeitstempel abzugleichen: Kompilieren Sie eine Zeichenfolge mit regulären Ausdrücken, z. B. die, die zum Abgleich von ISO8601-Zeitstempeln verwendet wird: ^\d{4}-\d{2}-\d{2}T \d{ 2}:\d{2}:\d{2}(\.\d+)?(Z|[+-][0-9]{2}:[0-9]{2})$ . Verwenden Sie die Funktion regexp.MatchString, um zu überprüfen, ob eine Zeichenfolge mit einem regulären Ausdruck übereinstimmt.

Der Unterschied zwischen Golang und Go-Sprache Der Unterschied zwischen Golang und Go-Sprache May 31, 2024 pm 08:10 PM

Go und die Go-Sprache sind unterschiedliche Einheiten mit unterschiedlichen Eigenschaften. Go (auch bekannt als Golang) ist bekannt für seine Parallelität, schnelle Kompilierungsgeschwindigkeit, Speicherverwaltung und plattformübergreifende Vorteile. Zu den Nachteilen der Go-Sprache gehören ein weniger umfangreiches Ökosystem als andere Sprachen, eine strengere Syntax und das Fehlen dynamischer Typisierung.

Wie vermeidet man Speicherlecks bei der technischen Leistungsoptimierung von Golang? Wie vermeidet man Speicherlecks bei der technischen Leistungsoptimierung von Golang? Jun 04, 2024 pm 12:27 PM

Speicherlecks können dazu führen, dass der Speicher des Go-Programms kontinuierlich zunimmt, indem: Ressourcen geschlossen werden, die nicht mehr verwendet werden, wie z. B. Dateien, Netzwerkverbindungen und Datenbankverbindungen. Verwenden Sie schwache Referenzen, um Speicherlecks zu verhindern, und zielen Sie auf Objekte für die Garbage Collection ab, wenn sie nicht mehr stark referenziert sind. Bei Verwendung von Go-Coroutine wird der Speicher des Coroutine-Stapels beim Beenden automatisch freigegeben, um Speicherverluste zu vermeiden.

Wie kann ich die Golang-Funktionsdokumentation in der IDE anzeigen? Wie kann ich die Golang-Funktionsdokumentation in der IDE anzeigen? Apr 18, 2024 pm 03:06 PM

Go-Funktionsdokumentation mit der IDE anzeigen: Bewegen Sie den Cursor über den Funktionsnamen. Drücken Sie den Hotkey (GoLand: Strg+Q; VSCode: Nach der Installation von GoExtensionPack F1 und wählen Sie „Go:ShowDocumentation“).

Eine Anleitung zum Unit-Testen gleichzeitiger Go-Funktionen Eine Anleitung zum Unit-Testen gleichzeitiger Go-Funktionen May 03, 2024 am 10:54 AM

Das Testen gleichzeitiger Funktionen in Einheiten ist von entscheidender Bedeutung, da dies dazu beiträgt, ihr korrektes Verhalten in einer gleichzeitigen Umgebung sicherzustellen. Beim Testen gleichzeitiger Funktionen müssen grundlegende Prinzipien wie gegenseitiger Ausschluss, Synchronisation und Isolation berücksichtigt werden. Gleichzeitige Funktionen können Unit-Tests unterzogen werden, indem Rennbedingungen simuliert, getestet und Ergebnisse überprüft werden.

Was ist zu beachten, wenn Golang-Funktionen Kartenparameter empfangen? Was ist zu beachten, wenn Golang-Funktionen Kartenparameter empfangen? Jun 04, 2024 am 10:31 AM

Beim Übergeben einer Karte an eine Funktion in Go wird standardmäßig eine Kopie erstellt und Änderungen an der Kopie haben keinen Einfluss auf die Originalkarte. Wenn Sie die Originalkarte ändern müssen, können Sie sie über einen Zeiger übergeben. Leere Karten müssen mit Vorsicht behandelt werden, da es sich technisch gesehen um Nullzeiger handelt und die Übergabe einer leeren Karte an eine Funktion, die eine nicht leere Karte erwartet, einen Fehler verursacht.

See all articles