Warum können Go-Funktionen keine Typen mit eingeschränkten Typparametern zurückgeben?

WBOY
Freigeben: 2024-02-09 15:06:09
nach vorne
890 Leute haben es durchsucht

为什么 Go 函数不能返回带有约束类型参数的类型?

Warum können Go-Funktionen keine Typen mit eingeschränkten Typparametern zurückgeben? Diese Frage sorgt oft für Verwirrung. In der Go-Sprache kann der Rückgabetyp einer Funktion kein Typ mit eingeschränkten Typparametern sein. Dies liegt hauptsächlich an der eingeschränkten Unterstützung für Generika in der Go-Sprache. In der Go-Sprache gibt es keinen generischen Mechanismus ähnlich dem in Java oder C# und es gibt keine Syntax zur Unterstützung eingeschränkter Typparameter. Daher kann der Rückgabetyp einer Funktion nur ein bestimmter Typ sein und eingeschränkte Typparameter können nicht verwendet werden. Das bedeutet, dass wir keinen Rückgabetyp in einer Funktion definieren können, deren Parametertyp ein eingeschränkter Typ ist. Solche Einschränkungen können das Schreiben von Code in bestimmten Szenarien etwas umständlicher machen, sind aber auch Teil des Go-Sprachdesigns.

Frageninhalt

Beim Versuch, gültige Zustandsübergänge zur Kompilierzeit in go zu erzwingen, bin ich auf die Einschränkung gestoßen, dass Funktionen keine generischen Typen mit nicht konkreten Typparametern zurückgeben können, wie in der Ausgabe hier beschrieben. MRE kann nicht erstellt werden (Link zum Spielplatz):

type mystruct[t any] struct {
    myfield t
}

func returnconstrainedgeneric[t any]() mystruct[t] {
    return mystruct[int]{
        myfield: 1,
    }
}
Nach dem Login kopieren

Compiler gibt Fehler zurück cannot use mystruct[int]{…} (value of type mystruct[int]) as mystruct[t] value in return statements.

Die verlinkte Frage gibt folgende Begründung:

The error occurs because operations that involve a type parameter (including assignments and returns) must be valid for all types in its type set.
Nach dem Login kopieren

Es werden mehrere Problemumgehungen beschrieben, einschließlich Typzusicherungen, aber ich bin neugierig, warum diese Einschränkung besteht. Naiverweise möchte ich in meinem Beispiel von returnconstrainedgeneric() 返回 mystruct[int] 类型的值是有效的,因为 int 满足 any 的类型约束。我希望 returnconstrainedgeneric() 的调用者不知道返回值的类型为 mystruct[int],它只知道它是 mystruct[t],其中 t 满足 any einschränken. Was fehlt in meiner Argumentation? Handelt es sich hierbei um ein grundlegendes Problem bei der Implementierung von Generics/Type-Einschränkungen durch Go oder um ein Problem bei der aktuellen Implementierung des Go-Compilers oder um etwas anderes?

Problemumgehung

Dies ist ungültig, da die Syntax

bedeutet
x:=returnconstrainedgeneric[string]()
// x is mystruct[string]
Nach dem Login kopieren

Aber du versuchst zurückzukehren mystruct[int].

Der Fehler in Ihrer Argumentation besteht darin, dass Sie den Rückgabetyp der Funktion angeben, wenn Sie sie instanziieren. Die Funktion kann nicht denselben Wert zurückgeben, der any 约束的类型,它返回实例化的类型。换句话说,实例化函数的 t 必须与 mystruct[t] 中的 t erfüllt.

Wenn Sie immer wiederkommen mystruct[int], erklären Sie es so:

func returnconstrainedgeneric[t any]() mystruct[int] {...}
Nach dem Login kopieren

Oder, wenn die Funktion gar nicht genutzt wird t:

func returnConstrainedGeneric() MyStruct[int] {...}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWarum können Go-Funktionen keine Typen mit eingeschränkten Typparametern zurückgeben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:stackoverflow.com
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!