Maison  >  Article  >  développement back-end  >  Introduction détaillée au transfert forcé de la structure Golang

Introduction détaillée au transfert forcé de la structure Golang

PHPz
PHPzoriginal
2023-03-30 09:08:011884parcourir

En langage Go, la structure est un type de données très courant. Une structure est une collection définie par un ensemble de types. Chaque structure peut contenir plusieurs champs, chacun avec son propre nom et son propre type. Dans le développement réel, nous utilisons souvent la conversion de type de structure, qui consiste à forcer un type de structure vers un autre type de structure. Ensuite, cet article vous donnera une introduction détaillée au transfert forcé de la structure Golang.

La coercition de type structure Golang a principalement les trois méthodes suivantes :

Méthode 1 : Utiliser l'assertion de type

Dans le langage Go, vous pouvez utiliser l'assertion de type (Type Assertion) pour implémenter la coercition de type structure. Les assertions de type peuvent être utilisées pour déterminer si la valeur stockée dans une variable d'interface est un type spécifique ou pour convertir le type d'interface en d'autres types. Voici un exemple :

type Person struct {
    Name string
    Age  int
}

type Student struct {
    Name string
    Age  int
    Grade int
}

func main() {
    var p Person
    p.Name = "张三"
    p.Age = 22

    // 转换为Student类型
    s, ok := interface{}(&p).(*Student)
    if ok {
        fmt.Println(s.Name, s.Age, s.Grade)
    } else {
        fmt.Println("类型转换失败")
    }
}

Dans le code ci-dessus, nous convertissons la structure de type Personne p en une structure de type Étudiant. Puisque p est en fait une structure de type Personne, l’opération de conversion échouera. Afin d'éviter la panique, nous utilisons la méthode ok-idiom, c'est-à-dire que lors d'une conversion de type forcée, nous déterminons également si le résultat de la conversion de type est réussi. En cas de succès, renvoyez le nouvel objet après la conversion, sinon renvoyez zéro.

Méthode 2 : convertir en json puis dans la structure cible

En plus d'utiliser des assertions de type pour la conversion de type, vous pouvez également utiliser la sérialisation et la désérialisation json pour obtenir une conversion forcée du type de structure. Les étapes spécifiques sont les suivantes :

  1. Sérialisez l'objet source dans une chaîne json.
  2. Désérialisez la chaîne json dans l'objet cible et la conversion est terminée.
type Person struct {
    Name string
    Age  int
}

type Student struct {
    Name string
    Age  int
    Grade int
}

func main() {
    var p Person
    p.Name = "张三"
    p.Age = 22

    // 转换为Student类型
    b, _ := json.Marshal(&p)
    var s Student
    json.Unmarshal(b, &s)
    fmt.Println(s.Name, s.Age, s.Grade)
}

Dans le code ci-dessus, nous forçons la structure de type Personne p en une structure de type Étudiant. Tout d’abord, nous utilisons la fonction json.Marshal() pour convertir l’objet source p en une chaîne json b ; puis, nous utilisons la fonction json.Unmarshal() pour désérialiser la chaîne json b en l’objet cible s. Il n'est pas nécessaire de déterminer si la conversion de type a réussi car la fonction json.Unmarshal() ne renvoie pas d'erreur.

Méthode 3 : copie directe d'octets

En plus d'utiliser les assertions de type et la sérialisation et désérialisation json pour la conversion de type, vous pouvez également copier directement des octets. Les étapes spécifiques sont les suivantes :

  1. Sérialisez d'abord la structure source pour obtenir une tranche d'octets.
  2. Copiez la tranche d'octets dans la structure cible.
  3. Désérialisez la structure cible et la conversion est terminée.
type Person struct {
    Name string
    Age  int
}

type Student struct {
    Name string
    Age  int
    Grade int
}


func main() {
    var p Person
    p.Name = "张三"
    p.Age = 22

    // 转换为Student类型
    var s Student
    b, _ := json.Marshal(&p)
    copy((*(*[1 << 20]byte)(unsafe.Pointer(&s)))[:], b)
    fmt.Println(s.Name, s.Age, s.Grade)
}

Dans le code ci-dessus, nous forçons la structure de type Personne p en une structure de type Étudiant. Tout d'abord, nous utilisons la fonction json.Marshal() pour convertir la structure source p en un tableau d'octets b ; puis, nous utilisons la fonction copy() pour copier le tableau d'octets b dans l'espace mémoire de la structure cible ; utilisez json La fonction .Unmarshal() désérialise la structure cible pour terminer la conversion de type.

Conclusion :

Les trois méthodes ci-dessus peuvent toutes réaliser une conversion de type de structure. Dans le développement réel, nous devons choisir la méthode appropriée en fonction de nos propres besoins. Il convient de noter que lors de l'utilisation de la conversion de structure de type de pointeur, une attention particulière doit être accordée à des problèmes tels que la copie approfondie des valeurs de pointeur et l'exactitude du type.

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