Umgang mit Typzuweisungsbeschränkungen in Generics
Das Zuweisen eines Literalwerts zu einem Strukturfeld eines generischen Typs kann zu einem „InkompatiblenAssign“-Fehler führen . Dieses Problem tritt auf, wenn die Typbeschränkung Typen umfasst, die nicht zur gleichen „Typgruppe“ gehören, wie etwa Ganzzahlen und Gleitkommazahlen.
In diesem speziellen Kontext die Methodendeklaration
func (f *foo[float64]) setValToPi() { f.val = 3.14 // IncompatibleAssign: cannot use 3.14 (untyped float constant) as float64 value in assignment }
versucht, einem Feld des generischen Typs foo ein Gleitkommaliteral zuzuweisen. Der Typparameter T ist jedoch auf ~float32 | beschränkt ~float64 | ~int, was bedeutet, dass eine Instanz von foo mit einem Integer-Typ instanziiert werden könnte.
Um zu verstehen, warum dieser Fehler auftritt, ist es wichtig zu erkennen, dass die Methodendeklaration allein den generischen Typ nicht instanziiert. Der Typparameter float64 in eckigen Klammern ist lediglich ein Platzhalter für den tatsächlichen Typ, der zum Instanziieren der foo-Struktur verwendet wird.
Innerhalb der Methode besteht die einzige Information über den Typ des Felds val darin, dass es auf Constraint beschränkt ist. nicht unbedingt float64. Das Gleitkomma-Literal 3.14 ist untypisiert, was bedeutet, dass es nicht sicher allen möglichen Instanzen von foo zugewiesen werden kann, insbesondere solchen mit einem Integer-Typ.
Um dieses Problem zu lösen, besteht ein Ansatz darin, einen generischen Parameter zu verwenden Typ anstelle eines festen Typs innerhalb der Methode:
func (f *foo[T]) SetValue(val T) { f.val = val }
Dadurch kann die Methode Werte des generischen Parametertyps akzeptieren und so die Kompatibilität unabhängig vom Typ gewährleisten, der zur Instanziierung verwendet wird foo.
Alternativ umfassen andere Lösungen die Verwendung von „any/interface{}“ als Feldtyp oder das Erkunden von Techniken wie Typzusicherungen oder Generika mit Schnittstellentypen.
Das obige ist der detaillierte Inhalt vonWie kann ich „InkompatibleAssign'-Fehler beim Zuweisen von Literalwerten zu generischen Strukturfeldern in Go beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!