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
Linda Hamiltonoriginal
2024-12-30 10:34:10333parcourir

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:"-"`
}

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:"-"`
}

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

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
}

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!

Déclaration:
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