Heim > Backend-Entwicklung > Golang > Warum führt die Zuweisung von Wertliteralen zu generischen Strukturfeldern in Go manchmal zu „InkompatiblenAssign'-Fehlern?

Warum führt die Zuweisung von Wertliteralen zu generischen Strukturfeldern in Go manchmal zu „InkompatiblenAssign'-Fehlern?

Susan Sarandon
Freigeben: 2024-12-19 06:54:20
Original
639 Leute haben es durchsucht

Why Does Assigning Value Literals to Generic Struct Fields in Go Sometimes Result in

Wertliterale generischen Strukturfeldern zuweisen: Fehlerbehebung bei inkompatiblen Zuweisungsfehlern

In Go können generische Typen mit Einschränkungen definiert werden, die die zulässigen Typen einschränken für ihre Felder. Beim Zuweisen von Wertliteralen zu solchen Feldern können jedoch bestimmte Einschränkungen einen „InkompatibleAssign“-Fehler auslösen.

Stellen Sie sich das folgende Szenario vor:

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 wird fehlerfrei kompiliert, da die Einschränkungsschnittstelle enthält sowohl ~float32 als auch ~float64. Wenn wir die Einschränkung jedoch so ändern, dass sie auch ~int:

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

einschließt, tritt ein Fehler auf, da das Wertliteral 3.14 (eine untypisierte Gleitkommakonstante) nicht allen möglichen Instanzen von foo[T zugewiesen werden kann ], insbesondere solche, bei denen T ~int ist.

Das Problem entsteht, weil die Methodendeklaration:

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

nur eine Deklaration ist. Der generische Typ foo wird nicht instanziiert. Der Bezeichner float64 in den eckigen Klammern ist ein Typparametername, kein fester Typ.

Daher besteht innerhalb der Methode die einzige bekannte Information über den Typ von val darin, dass er durch eine Einschränkung eingeschränkt ist. In diesem Fall ist die Einschränkung die Union ~float32 | ~float64 | ~int, was bedeutet, dass der Wert 3.14 nicht der ~int-Instanz von foo[T] zugewiesen werden kann.

Lösung:

Um dieses Problem zu beheben, haben wir mehrere Möglichkeiten :

  1. Deklarieren Sie die Methode als:
func (f *foo[T]) setValToPi() {
    // ...
}
Nach dem Login kopieren

Dies wird resultieren im gleichen Fehler, aber mit T anstelle von float64.

  1. Deklarieren Sie die Methode als:
func (f *foo[T]) SetValue(val T) {
    f.val = val
}
Nach dem Login kopieren

Dies akzeptiert einen Wert vom Typ Parametertyp und ermöglicht die Zuweisung von Wertliteralen wie 3.14 zu einem beliebigen Untertyp innerhalb der Einschränkung.

  1. Verwenden Sie „any/interface{}“ als Feld Geben Sie eine benutzerdefinierte Methode ein und implementieren Sie sie, um den zugewiesenen Wert innerhalb der Methode zu überprüfen und zu konvertieren:
type foo struct {
    val interface{}
}

func (f *foo) SetPi() {
    f.val = 3.14
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWarum führt die Zuweisung von Wertliteralen zu generischen Strukturfeldern in Go manchmal zu „InkompatiblenAssign'-Fehlern?. 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