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 :
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.
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 :
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.
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 :
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!