Heim > Backend-Entwicklung > Golang > Wie kann ich die JSON-Tag-Einschränkungen von Go mithilfe nicht exportierter Strukturen und Typumwandlung umgehen?

Wie kann ich die JSON-Tag-Einschränkungen von Go mithilfe nicht exportierter Strukturen und Typumwandlung umgehen?

Linda Hamilton
Freigeben: 2024-12-30 10:34:10
Original
354 Leute haben es durchsucht

How Can I Work Around Go's JSON Tag Restrictions Using Unexported Structs and Type Casting?

Typumwandlung in nicht exportierten Strukturen verwenden

In Go können Sie nicht mehrere JSON-Tags für dasselbe Feld in einer Struktur definieren. Es gibt jedoch eine Problemumgehung durch Umwandlung zwischen nicht exportierten Strukturen.

Erstellen Sie zunächst zwei identisch strukturierte Strukturen mit unterschiedlichen JSON-Tags, wie in Ihrem Beispiel:

type Foo struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

type Bar struct {
    Name string `json:"employee_name"`
    // Age omitted with backtick syntax
    Age  int    `json:"-"`
}
Nach dem Login kopieren

Machen Sie Bar jetzt nicht exportiert indem der Name mit einem Kleinbuchstaben beginnt:

type bar struct {
    Name string `json:"employee_name"`
    Age  int    `json:"-"`
}
Nach dem Login kopieren

Um von Foo in bar umzuwandeln, wandeln Sie Foo in um *Bar, wie unten gezeigt:

f := Foo{Name: "Sam", Age: 20}
b := (*bar)(unsafe.Pointer(&f))

// b now has the modified JSON tags
Nach dem Login kopieren

Vorsichtsmaßnahmen:

  • Diese Technik sollte vorsichtig und nur in einer kontrollierten Umgebung angewendet werden.
  • Stellen Sie niemals den nicht exportierten Balkentyp außerhalb des aktuellen Pakets bereit.
  • Stellen Sie sicher, dass die Typen immer ausgerichtet sind, da sonst der Guss erfolgt Panik.

Beispiel:

package main

import "fmt"
import "unsafe"

type Foo struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

type bar struct {
    Name string `json:"employee_name"`
    Age  int    `json:"-"`
}

func main() {
    f := Foo{Name: "Sam", Age: 20}
    b := (*bar)(unsafe.Pointer(&f))

    fmt.Println(b.Name, b.Age) // Output: Sam 0

    // Changing f.Age affects b.Age
    f.Age = 30
    fmt.Println(b.Name, b.Age) // Output: Sam 30
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie kann ich die JSON-Tag-Einschränkungen von Go mithilfe nicht exportierter Strukturen und Typumwandlung umgehen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage