Heim  >  Artikel  >  Backend-Entwicklung  >  Warum können Go-Funktionen keine Typen mit eingeschränkten Typparametern zurückgeben?

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

WBOY
WBOYnach vorne
2024-02-09 15:06:09866Durchsuche

为什么 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,
    }
}

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.

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]

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] {...}

Oder, wenn die Funktion gar nicht genutzt wird t:

func returnConstrainedGeneric() MyStruct[int] {...}

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen