ProgrammierungGo Entwickler

Welche Datentypen in Go gelten als vergleichbar (comparable) und was passiert, wenn man versucht, nicht vergleichbare Typen zu vergleichen? Wie beeinflusst das die Verwendung von map und set?

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort

In Go können Variablen miteinander mit dem Operator == verglichen werden oder als Schlüssel in einer map verwendet werden, wenn ihr Typ vergleichbar ist. Zu den vergleichbaren Typen gehören:

  • Alle numerischen Typen (int, float64, ...)
  • Zeichen (string, rune)
  • Zeiger
  • Kanäle
  • Schnittstellen, wenn ihre Werte vergleichbar sind
  • Arrays und Strukturen, wenn alle ihre Felder vergleichbar sind

Slices, Maps, Funktionen — nicht vergleichbar!

Der Versuch, solche Werte zu vergleichen, führt zu einem Kompilierungsfehler. Zum Beispiel:

var a = []int{1,2,3} var b = []int{1,2,3} printf("%v", a==b) // compile error: slice kann nur mit nil verglichen werden

Um einen Wert als Schlüssel in einer map zu verwenden, muss er auf jeden Fall vergleichbar sein. Wenn der Typ nicht übereinstimmt — Kompilierungsfehler.

Fangfrage

"Können zwei Strukturen vergleichbar sein, wenn nur ein Teil ihrer Felder nicht vergleichbar ist?"

Viele antworten mit "ja", aber das ist falsch. Wenn auch nur ein Feld der Struktur nicht vergleichbar ist (zum Beispiel ein Slice oder Map), wird die gesamte Struktur nicht vergleichbar.

Beispiel:

type T struct { A int S []string } var t1, t2 T t1 == t2 // compile error: Slices sind nicht vergleichbar

Beispiele für echte Fehler aufgrund mangelnden Wissens über die Feinheiten des Themas


Geschichte

Der Entwickler versuchte, ein Slice als Schlüssel für eine map zu verwenden, um die Ergebnisse von Berechnungen zwischenzuspeichern, was zu einem Kompilierungsfehler führte. Er wurde durch einen String mit einem expliziten Serializer ersetzt — das Problem wurde gelöst.


Geschichte

Als er ein neues Feld (vom Typ Slice) in die Struktur, die als Schlüssel für ein Dictionary verwendet wurde, hinzufügte, stellte das Projekt plötzlich das Kompilieren ein. Der Grund: Die Struktur wurde jetzt nicht mehr vergleichbar, aber niemand hatte erwartet, dass sich das in tiefere, verschachtelte Strukturen auswirken würde.


Geschichte

Um ein Set von Strukturen mit Slices darin zu erstellen, versuchten sie, eine map zu verwenden. Ohne die Regeln des Vergleichs zu verstehen, erhielten sie viele Laufzeiterrors beim Versuch, Elemente zu vergleichen, aber die Ursache lag in der Unmöglichkeit, sie mit solch einem Schlüssel zu kompilieren.