Heim >Backend-Entwicklung >Golang >Wie vermeide ich InkompatibleAssign-Fehler bei der Verwendung gemischter Typeinschränkungen 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 }
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 }
Dieser Fehler stammt aus der Methodendeklaration:
func (f *foo[float64]) setValToPi() { // ... }
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 }
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!