Heim > Backend-Entwicklung > Golang > Wie vermeide ich InkompatibleAssign-Fehler bei der Verwendung gemischter Typeinschränkungen in Go Generics?

Wie vermeide ich InkompatibleAssign-Fehler bei der Verwendung gemischter Typeinschränkungen in Go Generics?

Patricia Arquette
Freigeben: 2024-12-28 10:21:10
Original
666 Leute haben es durchsucht

How to Avoid IncompatibleAssign Errors When Using Mixed Type Constraints in Go Generics?

Verwalten von inkompatiblen AssignErrors in generischen Typen mit gemischten Wertbeschränkungen

In Go ermöglichen Generika die Erstellung von Typen mit spezifischen Einschränkungen für ihre Felder. Das Zuweisen von Wertliteralen zu Strukturfeldern kann jedoch zu InkompatiblenAssign-Fehlern führen, wenn verschiedene Typgruppen in den Einschränkungen gemischt werden.

Betrachten Sie dieses Beispiel:

type constraint interface {
    ~float32 | ~float64
}

type foo[T constraint] struct {
    val T
}

func (f *foo[float64]) setValToPi() {
    f.val = 3.14
}
Nach dem Login kopieren

Dieser Code weist dem Wert das Literal 3.14 zu Feld vom Typ foo[float64]. Dies ist akzeptabel, da 3.14 ein gültiger Float64-Wert ist.

Der Fehler tritt jedoch auf, wenn die Einschränkung um int-Typen erweitert wird:

type constraint interface {
    ~float32 | ~float64 | ~int
}

type foo[T constraint] struct {
    val T
}

func (f *foo[float64]) setValToPi() {
    f.val = 3.14 // IncompatibleAssign: cannot use 3.14 (untyped float constant) as float64 value in assignment
}
Nach dem Login kopieren

Dieser Fehler stammt aus der Methodendeklaration:

func (f *foo[float64]) setValToPi() {
    // ...
}
Nach dem Login kopieren

Hier wird float64 als Typparametername und nicht als beabsichtigte Einschränkung behandelt. Folglich kann der Compiler den spezifischen Typ des Val-Felds nicht bestimmen und nicht überprüfen, ob 3.14 mit allen möglichen Einschränkungsinstanzen kompatibel ist.

Um dieses Problem zu beheben, ist es wichtig, einen generischen Methodenparameter zu verwenden, um einen Wert von zu akzeptieren stattdessen den Typparametertyp:

func (f *foo[T]) SetValue(val T) {
    f.val = val
}
Nach dem Login kopieren

Diese Lösung verhindert die Zuweisung fester Werte wie 3.14, was in diesem Zusammenhang eine unangemessene Vorgehensweise ist. Alternative Ansätze umfassen die Verwendung von „any/interface{}“ als Feldtyp.

Das obige ist der detaillierte Inhalt vonWie vermeide ich InkompatibleAssign-Fehler bei der Verwendung gemischter Typeinschränkungen in Go Generics?. 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