Maison >développement back-end >Golang >Comment créer en toute sécurité une tranche ou un tableau Go à partir d'un « unsafe.Pointer » ?

Comment créer en toute sécurité une tranche ou un tableau Go à partir d'un « unsafe.Pointer » ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-10 12:08:09973parcourir

How to Safely Create a Go Slice or Array from an `unsafe.Pointer`?

Comment créer un tableau ou une tranche à partir d'un tableau non sécurisé.Pointeur en Go ?

Question :

Donnée un pointeur dangereux vers un tableau, comment pouvons-nous créer un tableau ou une tranche à partir de celui-ci sans encourir le coût de la mémoire copie ?

Réponse :

Création d'une tranche à l'aide de Reflect :

L'approche recommandée consiste à utiliser le package Reflect pour créer un en-tête de tranche qui pointe vers les mêmes données sous-jacentes que celles non sécurisées pointeur.

// Create a slice header
sh := &reflect.SliceHeader{
    Data: p, // Unsafe pointer to the array
    Len:  size,
    Cap:  size,
}

// Use the slice header to create a slice
data := *(*[]byte)(unsafe.Pointer(sh))

Création d'un tableau à l'aide de Reflect :

Pour créer un tableau (pointeur vers des éléments en mémoire contiguë) à partir d'un pointeur non sécurisé, nous pouvons d'abord créer une tranche puis prendre son adresse :

// Create a slice
data := *(*[]byte)(unsafe.Pointer(&reflect.SliceHeader{
    Data: p,
    Len:  size,
    Cap:  size,
}))

// Get the address of the slice (pointer to the first element)
arr := (*[size]byte)(unsafe.Pointer(&data[0]))

Mises en garde et Avertissements :

  • Assurez-vous que la durée de vie du tableau d'origine est gérée pour empêcher tout accès inattendu à la mémoire.
  • Évitez d'utiliser des variables uintptr comme références à des objets, car un garbage collection peut se produire de manière inattendue.
  • Utilisez runtime.KeepAlive() si nécessaire pour empêcher le tableau d'origine d'être récupéré avant qu'il ne soit référencé par la tranche ou le tableau créé à partir du pointeur dangereux.

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