Heim > Backend-Entwicklung > Golang > Warum sind Schnittstellen mit Typbeschränkungen in Go verboten?

Warum sind Schnittstellen mit Typbeschränkungen in Go verboten?

Patricia Arquette
Freigeben: 2024-11-07 04:12:03
Original
1045 Leute haben es durchsucht

Why Are Interfaces with Type Constraints Forbidden in Go?

Schnittstellentypbeschränkungen: „Typbeschränkungen“-Fehler verstehen und vermeiden

In Go sind Schnittstellen leistungsstarke Konstrukte, die eine Reihe von Methoden definieren, die Ein Typ muss implementiert werden. Allerdings sind nicht alle Schnittstellen gleich. Schnittstellen, die Typeinschränkungen enthalten, erlegen zusätzliche Einschränkungen für ihre Verwendung auf.

Beachten Sie die folgende Typdefinition:

type Number interface {
    int | int64 | float64
}
Nach dem Login kopieren

Diese Schnittstelle definiert einen Typ Number, der entweder int, int64 oder float64 darstellen kann. Die Go-Sprachspezifikationen verbieten jedoch ausdrücklich die Verwendung solcher Schnittstellen mit Typelementen in einem anderen Kontext als als Typparametereinschränkungen.

Der Compiler gibt den Fehler „Schnittstelle enthält Typeinschränkungen“ aus, wenn Sie versuchen, eine Schnittstelle mit zu verwenden Typelemente in anderen Szenarien. Beispielsweise kann das folgende Code-Snippet nicht kompiliert werden:

type NumberSlice []Number // interface contains type constraints

func main() {
    a := []Number{Number(1), Number(2), Number(3), Number(4)} // cannot use interface Number in conversion
}
Nach dem Login kopieren

Dieser Fehler liegt daran, dass Number eine Schnittstelle mit Typbeschränkungen ist und daher nicht als Elementtyp eines Slice verwendet werden kann.

Ähnlich wie Schnittstellen mit Typelementen sind auch Schnittstellen, die vergleichbare oder andere nicht-grundlegende Schnittstellen einbetten, nicht-grundlegend. Um diese Fehler zu vermeiden, stellen Sie sicher, dass Ihre Schnittstellen nur Methoden enthalten oder Basisschnittstellen einbetten.

Beispiele für Basis- und Nicht-Basisschnittstellen:

  • Basic: Nur Methoden

    type A1 interface {
      GetName() string
    }
    Nach dem Login kopieren
  • Basic: Methoden und eingebettete Basisschnittstelle

    type B1 interface {
      A1
      SetValue(v int)
    }
    Nach dem Login kopieren
  • Non-Basic: Integriert vergleichbare

    type Message interface {
      comparable
      Content() string
    }
    Nach dem Login kopieren
  • Nicht-Basic: Hat ein Typelement (Union)

    type Number interface {
      int | int64 | float64
    }
    Nach dem Login kopieren
  • Nicht-Basic: Bettet eine nicht-Basic-Schnittstelle ein

    type SpecialNumber interface {
      Number
      IsSpecial() bool
    }
    Nach dem Login kopieren

Korrekte Verwendung von Schnittstellen mit Typeinschränkungen

Schnittstellen mit Typeinschränkungen können nur als Typparametereinschränkungen verwendet werden. Zum Beispiel:

type Coordinates[T Number] struct {
    x, y T
}

func sum[T Number](a, b T) T {
    return a + b
}
Nach dem Login kopieren

In diesem Szenario werden die Schnittstellen verwendet, um die zulässigen Typen für generische Typen und Funktionen einzuschränken.

Das obige ist der detaillierte Inhalt vonWarum sind Schnittstellen mit Typbeschränkungen in Go verboten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage