Pourquoi Reflect.MakeSlice renvoie une valeur non adressable
Dans Go, le package Reflect fournit une interface pour inspecter et manipuler les types et les valeurs. Reflect.MakeSlice crée une tranche d'un type donné. Cependant, la valeur renvoyée n'est pas adressable. Cela signifie que vous ne pouvez pas prendre son adresse ni l'attribuer à un pointeur.
Solution : Utiliser Reflect.New()
Pour obtenir une tranche adressable par réflexion, vous peut utiliser la fonction reflex.New() pour créer un pointeur vers la tranche. Cela peut être fait comme suit :
// Create the slice type sliceType := reflect.SliceOf(SomeType) // Create a slice using reflect.MakeSlice slice := reflect.MakeSlice(sliceType, 10, 10) // Create a pointer to the slice slicePtr := reflect.New(slice.Type()) // Set the slice pointer to the slice slicePtr.Elem().Set(slice)
Maintenant, vous disposez d'une tranche adressable qui peut être transmise comme argument aux fonctions qui nécessitent un pointeur de tranche.
Pourquoi réfléchir. MakeSlice renvoie une valeur non adressable
Les variables de pile locales dans Go ne sont pas adressables car le moteur d'exécution peut les déplacer vers le tas à tout moment. Reflect.MakeSlice crée une variable de tranche locale, c'est pourquoi la valeur renvoyée n'est pas adressable.
Pourquoi un pointeur vers une tranche est requis
Certaines API, telles comme celui que vous avez mentionné dans le package mgo, nécessite un pointeur vers une tranche comme argument. En effet, lors de l'ajout à la tranche, une nouvelle tranche avec une capacité accrue peut être allouée. Si vous passez une tranche sans pointeur, les modifications apportées à la tranche ne seront pas visibles en dehors de la fonction.
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!