Ableiten benutzerdefinierter Typen für JSON-Unmarshaling in Go
Beim Arbeiten mit benutzerdefinierten Typen in Go ist es häufig erforderlich, die UnmarshalJSON-Funktion zu implementieren, um sie zu aktivieren automatische Konvertierung von JSON in den gewünschten Typ. Allerdings ergeben sich Herausforderungen, wenn der Typ von einem Skalarwert abgeleitet wird. In diesem Artikel wird eine Lösung zur Lösung dieses Problems untersucht.
Betrachten Sie das Beispiel eines PersonID-Typs, der subtypisierte Ganzzahlkonstanten zur Identifizierung von Personen darstellt. Wir möchten die Funktionalität dieses Typs erweitern, um die automatische Konvertierung von JSON-Strings zu unterstützen. Die Implementierung von UnmarshalJSON für diesen Typ wird schwierig, da er einen Skalarwert direkt zurückgeben oder ändern soll, während UnmarshalJSON eine Struktur für seine Änderung erwartet.
Um dieses Problem zu lösen, verwenden wir einen Zeigerempfänger-Ansatz. Durch die Verwendung eines Zeigerempfängers werden Änderungen, die innerhalb der UnmarshalJSON-Methode vorgenommen werden, auf den ursprünglichen Wert übertragen. Hier ist ein Beispiel der modifizierten UnmarshalJSON-Implementierung:
func (intValue *PersonID) UnmarshalJSON(data []byte) error { var s string if err := json.Unmarshal(data, &s); err != nil { return err } *intValue = Lookup(s) return nil }
In dieser Implementierung wird JSON-Text in eine Zeichenfolgenvariable entmarshallt, bevor er an die Lookup-Funktion übergeben wird, die die Zeichenfolge in den gewünschten PersonID-Wert konvertiert. Dieser Wert wird dann dem Zeiger intValue zugewiesen.
Um Konflikte zwischen den JSON-Tags und den JSON-Daten zu vermeiden, stellen Sie außerdem sicher, dass die Tags in der MyType-Struktur mit den Feldnamen im JSON übereinstimmen. Indem Sie diese Schritte befolgen, können Sie UnmarshalJSON erfolgreich für abgeleitete Skalartypen implementieren.
Das obige ist der detaillierte Inhalt vonWie kann ich benutzerdefiniertes JSON-Unmarshaling für abgeleitete Skalartypen in Go implementieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!