Conversion entre des structures et des tableaux d'octets dans Go
Dans Go, vous pouvez rencontrer des situations où vous devez effectuer une conversion entre des structures et des tableaux d'octets, ou effectuez des opérations de type C telles que la conversion de type et la copie de mémoire. Cet article explore des solutions pour ces tâches.
Casting de type
Go ne prend pas en charge le cast de type C, mais vous pouvez utiliser le type unsafe.Pointer pour effectuer des tâches similaires. opérations. Pour convertir une structure en tableau d'octets, utilisez la fonction unsafe.Pointer() pour convertir l'adresse de la structure en pointeur :
<code class="go">type packet struct { opcode uint16 data [1024]byte } var pkt1 packet // Convert pkt1 to a byte array byteArray := (*[unsafe.Sizeof(pkt1)]byte)(unsafe.Pointer(&pkt1))</code>
Pour reconvertir un tableau d'octets en structure, utilisez unsafe.Pointer () fonctionne à nouveau pour convertir le pointeur du tableau d'octets vers le type de structure souhaité :
<code class="go">// Convert byteArray back to a packet struct pkt2 := *(**packet)(unsafe.Pointer(&byteArray))</code>
Copie de mémoire
While Go n'a pas d'équivalent direct du memcpy (), vous pouvez utiliser la fonction copy() pour effectuer des copies de mémoire. Pour copier les données d'un tableau d'octets vers une structure, vous pouvez utiliser la syntaxe suivante :
<code class="go">type file_info struct { file_size uint32 // 4 bytes file_name [1020]byte } var file file_info copy(unsafe.Pointer(&file), pkt1.data) // Copy data from pkt1.data to file</code>
Utilisation du package encoding/binary
Comme alternative à en utilisant unsafe.Pointer, vous pouvez utiliser le package encoding/binary pour gérer les conversions de type entre les structures et les tableaux d'octets. Ce package fournit des fonctions d'encodage et de décodage des données aux formats binaires, facilitant ainsi la gestion de l'endianité et de la taille des données :
<code class="go">// Convert a struct to a byte array t := T{A: 0xEEFFEEFF, B: 3.14} var buf bytes.Buffer binary.Write(&buf, binary.BigEndian, t) // Encode struct t to buf // Convert a byte array to a struct t2 := T{} binary.Read(&buf, binary.BigEndian, &t2) // Decode byte array buf into struct t2</code>
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!