Maison > développement back-end > Golang > interface Golang pour structurer

interface Golang pour structurer

PHPz
Libérer: 2023-05-10 11:12:36
original
3694 Les gens l'ont consulté

En Golang, l'interface et la structure sont deux types de données courants. Une interface est un type abstrait qui définit un ensemble de méthodes sans implémentation, tandis qu'une structure est un type concret utilisé pour organiser et stocker des données. Dans le développement réel, nous devrons peut-être convertir l'interface en structure. Cet article présentera deux méthodes pour convertir les interfaces en structures dans Golang.

1. Utilisez la réflexion pour convertir l'interface en structure

En golang, vous pouvez utiliser la réflexion pour terminer l'opération de conversion de l'interface en structure. La réflexion est un mécanisme puissant capable de lire et de modifier dynamiquement des informations telles que la valeur, le type et les attributs d'une variable au moment de l'exécution. En réflexion, ceux couramment utilisés incluent Reflect.Value et Reflect.Type.

Les étapes spécifiques de mise en œuvre sont les suivantes :

  1. Créez un type de structure pour stocker les données dans l'interface. Par exemple :
type Person struct {
    Name string
    Age  int
}
Copier après la connexion
  1. Créez un type d'interface pour convertir les données en structure. Par exemple :
type PersonInterface interface {
    GetName() string
    GetAge() int
}
Copier après la connexion
Copier après la connexion
  1. Implémentez une fonction pour convertir le type d'interface en type de structure. Par exemple :
func ConvertInterfaceToStruct(p PersonInterface) (Person, error) {
    var person Person
    value := reflect.ValueOf(p)
    if value.Kind() == reflect.Ptr && !value.IsNil() {
        value = value.Elem()
        if value.Kind() == reflect.Struct {
            person.Name = value.FieldByName("Name").String()
            person.Age = int(value.FieldByName("Age").Int())
            return person, nil
        }
    }
    return person, fmt.Errorf("invalid type:%v", reflect.TypeOf(p))
}
Copier après la connexion

Dans cette fonction, convertissez d'abord le type d'interface en une valeur de réflexion (reflect.Value), puis déterminez si la valeur est un type de pointeur et non nulle. Ensuite, le type de pointeur est converti en type de structure, puis les valeurs des champs Nom et Âge sont obtenues par réflexion, et enfin le type de structure Personne est renvoyé.

  1. Test dans la fonction principale. Par exemple :
func main() {
    p := &Person{Name: "Tom", Age: 20}
    fmt.Println(p)
    if ps, err := ConvertInterfaceToStruct(p); err != nil {
        log.Fatal(err)
    } else {
        fmt.Println(ps)
    }
}
Copier après la connexion
Copier après la connexion

Dans ce code de test, créez un pointeur de structure Personne et utilisez la fonction ConvertInterfaceToStruct implémentée pour convertir le type de pointeur en type de structure Personne et afficher le résultat.

2. Utilisez json pour implémenter l'interface et la convertir en structure

Dans Golang, json est un format de données courant, et un objet peut être sérialisé en structure via json.Marshal() chaîne json, vous pouvez également désérialiser une chaîne json en un objet via json.Unmarshal().

Les étapes spécifiques de mise en œuvre sont les suivantes :

  1. Créez un type de structure pour stocker les données dans l'interface. Par exemple :
type Person struct {
    Name string `json:"name,omitempty"`
    Age  int    `json:"age,omitempty"`
}
Copier après la connexion

Dans cette structure, le nom du champ json est spécifié pour correspondre à son nom de champ dans l'interface afin de réaliser la conversion.

  1. Créez un type d'interface pour convertir les données en structure. Par exemple :
type PersonInterface interface {
    GetName() string
    GetAge() int
}
Copier après la connexion
Copier après la connexion
  1. Implémentez une fonction pour convertir le type d'interface en type de structure. Par exemple :
func ConvertInterfaceToStruct(p PersonInterface) (Person, error) {
    jsonStr, err := json.Marshal(p)
    if err != nil {
        return Person{}, err
    }
    var person Person
    err = json.Unmarshal(jsonStr, &person)
    if err != nil {
        return Person{}, err
    }
    return person, nil
}
Copier après la connexion

Dans cette fonction, utilisez d'abord json.Marshal() pour convertir le type d'interface en chaîne json, puis utilisez json.Unmarshal() pour le convertir en Type de structure Personne et renvoie la structure.

  1. Test dans la fonction principale. Par exemple :
func main() {
    p := &Person{Name: "Tom", Age: 20}
    fmt.Println(p)
    if ps, err := ConvertInterfaceToStruct(p); err != nil {
        log.Fatal(err)
    } else {
        fmt.Println(ps)
    }
}
Copier après la connexion
Copier après la connexion

Dans ce code de test, créez un pointeur de structure Personne et utilisez la fonction ConvertInterfaceToStruct implémentée pour convertir le type de pointeur en type de structure Personne et afficher le résultat.

Résumé :

Les deux méthodes ci-dessus peuvent convertir le type d'interface en type de structure, en utilisant différentes manières de l'implémenter. La mise en œuvre de la méthode de réflexion est relativement faible. -level. Le jugement de type et la lecture par réflexion de champ sont requis, mais la méthode json est relativement simple et claire. Il vous suffit d'utiliser les méthodes de sérialisation et de désérialisation json dans golang. Le choix des différentes méthodes dépend de facteurs tels que les besoins réels et les performances.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal