Generische Verwendung in Unmarshal (Go 1.18)
Bei der Verwendung von Generika in Go 1.18, z. B. beim Erstellen eines Containers zur Aufnahme verschiedener Berichtstypen, Typbeschränkungen können auftreten. Betrachten Sie das folgende Setup:
Es können Probleme mit Typeinschränkungen für Rückgabetypen auftreten, die zu einer „Freitextsemantik“ in der GetBody()-Funktion führen, um die Typzusicherung zu berücksichtigen.
Herausforderungen und Lösungen
Das Problem ist darauf zurückzuführen, dass Go keine Typzusicherungen für Strukturen unterstützt und keine Zeiger auf generische Typen zulässt. Um dieses Problem zu beheben, können Sie eine Schnittstelle erstellen, die Getter für LocationID, Provider, ReportType und Body implementiert. Diese Lösung erfordert jedoch Einbußen bei der Typsicherheit.
Ein sichererer Ansatz besteht darin, auf parametrischen Polymorphismus zu verzichten und beim JSON-Unmarshalling eine konkrete Switch-Anweisung zu verwenden, die auf dem Diskriminatorwert basiert. Dadurch wird sichergestellt, dass für jeden Berichtstyp der richtige konkrete Typ verwendet wird.
Alternativer Ansatz
Für die dynamische JSON-Analyse können Sie eine generische Unmarshal-Funktion verwenden:
<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>
Obwohl diese Funktion Flexibilität bietet, ist es wichtig zu beachten, dass sie bei minimaler Implementierung lediglich die gleichen Aktionen ausführt wie die direkte Inline-Inline der Unmarshalling-Logik. Daher ist die Verwendung dieser Funktion nur dann gerechtfertigt, wenn sie zusätzliche Logik einführt.
Zusammenfassend lässt sich sagen, dass bei der Arbeit mit konkreten Typen und JSON-Unmarshalling sorgfältig die Notwendigkeit von Generika berücksichtigt werden muss. Entscheiden Sie sich bei Bedarf für eine schalterbasierte Lösung, ohne die Typensicherheit zu beeinträchtigen, und seien Sie vorsichtig, wenn Sie generische Funktionen verwenden, die die Funktionalität unnötig duplizieren.
Das obige ist der detaillierte Inhalt vonWie kann ich JSON mit generischen Typen in Go 1.18 sicher entmarshalieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!