Maison  >  Article  >  développement back-end  >  Comment puis-je récupérer une tranche d’octets à partir d’une chaîne en Go sans copie de mémoire ?

Comment puis-je récupérer une tranche d’octets à partir d’une chaîne en Go sans copie de mémoire ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-02 10:59:02757parcourir

How Can I Retrieve a Byte Slice from a String in Go Without Memory Copying?

Récupération d'une tranche d'octets à partir d'une chaîne sans copie de mémoire en utilisant Unsafe

Problème :

Vous devez convertir une chaîne à une tranche d'octets sans encourir la pénalité de performances de la copie de mémoire, en particulier pour la gestion de grands ensembles de données.

Réponse :

Étape 1 : Comprendre la copie de mémoire Problème

Les chaînes dans Go sont immuables, ce qui signifie qu'elles ne peuvent pas être modifiées sur place. Par conséquent, la conversion d'une chaîne en tranche d'octets à l'aide de la syntaxe []byte(string) entraîne une copie de la mémoire.

Étape 2 : Utilisation de Unsafe

Pour empêcher la mémoire copie, des opérations dangereuses peuvent être utilisées. La fonction unsafe String peut être utilisée pour récupérer un pointeur vers les données de chaîne sous-jacentes.

<code class="go">import "unsafe"

func unsafeGetBytes(s string) []byte {
    return (*[0x7fff0000]byte)(unsafe.Pointer(
        (*reflect.StringHeader)(unsafe.Pointer(&s)).Data),
    )[:len(s):len(s)]
}</code>

Explication :

  • La fonction unsafe.String renvoie un pointeur vers les données de la chaîne.
  • Le pointeur est converti en un grand tableau d'octets ([0x7fff0000]byte). Go permet une conversion non sécurisée vers des tableaux de taille non spécifiée.
  • Le tableau est ensuite utilisé pour créer une tranche d'octets de la même longueur que la chaîne.

Considérations supplémentaires :

  • Cette méthode ne doit être utilisée que pour les opérations internes où l'immuabilité n'est pas un problème.
  • Pour la gestion générale des chaînes, les optimisations WriteString ou de boucle (comme mentionné dans la description du problème) sont plus efficaces.
  • La compression de grands ensembles de données à l'aide de gzip éclipsera probablement le gain de performances obtenu en évitant la copie de mémoire.

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