Heim > Backend-Entwicklung > Golang > Wie kann ich „InkompatibleAssign'-Fehler beim Zuweisen von Literalwerten zu generischen Strukturfeldern in Go beheben?

Wie kann ich „InkompatibleAssign'-Fehler beim Zuweisen von Literalwerten zu generischen Strukturfeldern in Go beheben?

Mary-Kate Olsen
Freigeben: 2024-12-16 00:29:14
Original
402 Leute haben es durchsucht

How Can I Resolve

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
}
Nach dem Login kopieren

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
}
Nach dem Login kopieren

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!

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