Maison > développement back-end > Golang > Comment puis-je contourner les restrictions de balises JSON de Go à l'aide de structures non exportées et de conversion de type ?

Comment puis-je contourner les restrictions de balises JSON de Go à l'aide de structures non exportées et de conversion de type ?

Linda Hamilton
Libérer: 2024-12-30 10:34:10
original
327 Les gens l'ont consulté

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

Utilisation du transtypage de type dans des structures non exportées

Dans Go, vous ne pouvez pas définir plusieurs balises JSON pour le même champ dans une structure. Cependant, il existe une solution de contournement en utilisant le casting entre des structures non exportées.

Tout d'abord, créez deux structures de structure identique avec des balises JSON différentes, comme dans votre exemple :

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:"-"`
}
Copier après la connexion

Maintenant, rendez Bar non exporté. en commençant son nom par une lettre minuscule :

type bar struct {
    Name string `json:"employee_name"`
    Age  int    `json:"-"`
}
Copier après la connexion

Pour transformer Foo en bar, lancez Foo en *bar, comme indiqué ci-dessous :

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

// b now has the modified JSON tags
Copier après la connexion

Précautions :

  • Cette technique doit être utilisée avec prudence et uniquement dans un environnement contrôlé.
  • N'exposez jamais le type de barre non exporté en dehors du package actuel.
  • Assurez-vous que les types sont toujours alignés, sinon la diffusion sera panique.

Exemple :

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
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal