"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Pourquoi la fonction « reflect.MakeSlice » renvoie-t-elle une valeur non adressable ?

Pourquoi la fonction « reflect.MakeSlice » renvoie-t-elle une valeur non adressable ?

Publié le 2024-11-10
Parcourir:512

Why is the `reflect.MakeSlice` Function Returning an Un-Addressable Value?

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 que 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 transmettez une tranche sans pointeur, les modifications apportées à la tranche ne seront pas visibles en dehors de la fonction.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3