Création de tranches ou de tableaux à partir d'un pointeur non sécurisé dans Golang : une alternative efficace
Les pointeurs vers des tableaux peuvent être représentés sous forme de valeurs uintptr dans Golang. Cependant, accéder au tableau d'origine peut être difficile lorsque le pointeur est stocké en tant que uintptr.
Méthode inefficace : copie de mémoire
Une approche naïve consiste à copier les données de le pointeur dans une nouvelle tranche :
data := make([]byte, size) stepSize := unsafe.Sizeof(data[0]) for i := 0; i < size; i++ { data[i] = *(*byte)(unsafe.Pointer(p)) p += stepSize }
Cette méthode est inefficace car elle implique la copie de données, ce qui peut prendre du temps pour les grandes tableaux.
Méthode efficace : Reflect.SliceHeader
Une approche plus efficace consiste à utiliser Reflect.SliceHeader pour créer une tranche ou un tableau sans copier la mémoire :
var data []byte sh := (*reflect.SliceHeader)(unsafe.Pointer(&data)) sh.Data = p sh.Len = size sh.Cap = size fmt.Println(data)
Cette méthode convertit le uintptr en reflet.SliceHeader et modifie ses champs pour pointer vers l'existant. tableau. La tranche ou le tableau résultant partagera la même mémoire sous-jacente que le tableau d'origine.
Méthode alternative : littéral composite
Une autre alternative consiste à utiliser un littéral composite pour créer un Reflect.SliceHeader :
sh := &reflect.SliceHeader{ Data: p, Len: size, Cap: size, } data := *(*[]byte)(unsafe.Pointer(sh)) fmt.Println(data)
Cette approche produit le même résultat que la précédente méthode.
Précautions
Lors de l'utilisation de pointeurs uintptr, il est important de s'assurer que le tableau d'origine reste valide pendant toute la durée de vie du pointeur. De plus, les emballages dangereux doivent être utilisés avec prudence en raison de leur impact potentiel sur la sécurité 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!