Heim  >  Artikel  >  Backend-Entwicklung  >  Können Generics für das JSON-Unmarshaling in Go 1.18 verwendet werden?

Können Generics für das JSON-Unmarshaling in Go 1.18 verwendet werden?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-30 22:22:03549Durchsuche

Can Generics Be Used for JSON Unmarshaling in Go 1.18?

Generika und Unmarshal in Go 1.18

In Go 1.18 bringen Generika eine verbesserte Typsicherheit in die Sprache. Bei der Verwendung von Generika in Verbindung mit dem Unmarshaling von JSON-Daten treten jedoch bestimmte Einschränkungen auf.

Stellen Sie sich ein Szenario mit mehreren Berichtstypen vor, die jeweils in einem ReportContainerImpl gekapselt sind. Der Container enthält Parameter, die auf die Implementierung der Reportable-Schnittstelle beschränkt sind und verschiedene Berichtstypen darstellen. Das Unmarshaling stellt jedoch eine Herausforderung dar, da Go die Typzusicherung für Strukturen und Zeiger auf generische Rohtypen nicht unterstützt.

Um dieses Problem zu beheben, wird eine Schnittstelle, ReportContainer, eingeführt, die es ReportContainerImpl ermöglicht, sie zu implementieren. Typbeschränkungen für den Rückgabetyp von GetBody() können jedoch nicht erzwungen werden, was dazu führt, dass beim Unmarshaling eine Typzusicherung erforderlich ist.

Das Rätsel liegt in der Tatsache, dass generische Typparameter während der Kompilierung bekannt sein müssen, während JSON Das Unmarshaling erfolgt zur Laufzeit mit dynamischen Daten.

Die Herausforderung meistern

Die praktikabelste Lösung besteht darin, den parametrischen Polymorphismus für diesen speziellen Anwendungsfall aufzugeben. Es wird empfohlen, den bestehenden json.RawMessage-Ansatz beizubehalten, dynamische Daten innerhalb der Switch-Anweisung bedingt zu entmarshalieren und konkrete Strukturen zurückzugeben, die die ReportContainer-Schnittstelle implementieren.

Alternative Lösung: Generische Unmarshal-Funktion

In Szenarien, in denen Typparameter zur Kompilierungszeit bekannt sein können, könnte eine generische Unmarshaling-Funktion wie folgt eingesetzt werden:

<code class="go">func unmarshalAny[T any](bytes []byte) (*T, error) {
    out := new(T)
    if err := json.Unmarshal(bytes, out); err != nil {
        return nil, err
    }
    return out, nil
}</code>

Dies zeigt zwar das Konzept des generischen Unmarshalings, es sollte jedoch beachtet werden, dass Gos json.Unmarshal unterstützt bereits das Unmarshaling in jeden Typ. Somit erhöht die benutzerdefinierte generische Funktion nur die Komplexität, ohne einen zusätzlichen Wert zu bieten.

Zusammenfassend lässt sich sagen, dass es beim Umgang mit dynamischen JSON-Daten und dem Unmarshaling in Go ratsam ist, die Typsicherheit durch geeignete Verwendung von Schnittstellen und Typzusicherung zu bevorzugen parametrischer Polymorphismus.

Das obige ist der detaillierte Inhalt vonKönnen Generics für das JSON-Unmarshaling in Go 1.18 verwendet werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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