Maison > Article > développement back-end > Pourquoi une tranche créée avec « reflect.MakeSlice » n'est-elle pas adressable ?
En Go, l'adressabilité fait référence à la capacité d'obtenir l'adresse mémoire d'une variable et de garantir sa validité . Les variables de pile locale ne sont pas adressables et ce concept s'applique aux valeurs créées à l'aide de Reflect.MakeSlice.
Lors de l'utilisation de Reflect.MakeSlice, vous créez une nouvelle valeur de tranche. Cependant, cette valeur n'est pas stockée dans un emplacement mémoire avec une adresse connue. Au lieu de cela, il existe temporairement sur la pile. Cette valeur allouée par la pile ne peut pas être utilisée pour créer un pointeur vers une tranche, car l'adresse deviendrait invalide lorsque le cadre de pile serait détruit.
Pour résoudre ce problème et Pour obtenir une valeur de tranche adressable, vous pouvez utiliser Reflect.New(). Cette fonction crée un pointeur vers la tranche :
myType := reflect.TypeOf(my) slice := reflect.MakeSlice(reflect.SliceOf(myType), 10, 10) x := reflect.New(slice.Type()).Elem() x.Set(slice)
L'appel x.Elem() déréférence le pointeur et renvoie la valeur réelle de la tranche, qui peut maintenant être utilisée pour passer à la méthode All().
Selon la spécification du langage Go, une valeur est adressable si elle est :
Dans le cas de Reflect.MakeSlice, le nouveau créé slice ne répond à aucun de ces critères car il existe sur la pile et n'est pas stocké dans un emplacement mémoire permanent.
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!