Disons que j'ai la structure suivante:
type Person struct {
name string
age int
}
Si je fais un objet de cette structure
person1 := Person{name: "Name", age: 69}
Si je mets cet objet à zéro
person1 = nil
cela ne fonctionne pas, en fait c'est une erreur d'affectation de type, mais cela fonctionne pour les cartes et les tranches. Alors, comment pourrais-je autrement supprimer l'objet, c'est-à-dire désallouer? J'ai regardé la documentation de delete builtin mais elle supprime une entrée d'une carte donnée. Merci.
Go est une langue récupérée. Vous n'êtes pas censé le faire et vous ne pouvez pas supprimer des objets de la mémoire. Il incombe au garbage collector et responsabilité de le faire, et il le fait automatiquement . Le garbage collector supprimera correctement les objets de la mémoire lorsqu'ils deviennent inaccessibles.
Vous pouvez affecter nil
aux cartes et aux tranches car nil
est une valeur valide (la valeur zéro ) pour ces types. La valeur zéro pour les types struct
n'est pas nil
mais une valeur struct
où tous ses champs ont leurs valeurs nulles.
Si vous souhaitez effacer ou écraser la valeur de la structure, vous pouvez simplement assigner une autre valeur de structure, de préférence la valeur zéro (une structure vide):
person1 := Person{name: "Name", age: 69}
// work with person1
// Clear person1:
person1 = Person{}
Mais sachez que cela ne libérera pas la mémoire allouée par person1
; comme écrit précédemment, il sera libéré automatiquement par le GC quand il deviendra inaccessible.
nil
est également une valeur valide (la valeur zéro) pour les types de pointeurs, donc si person1
serait un pointeur vers Person
(c'est-à-dire *Person
), vous pouvez également lui affecter nil
, par exemple:
person1 := &Person{name: "Name", age: 69}
// work with person1
// Clear person1:
person1 = nil
Lorsque vous effacez un pointeur en le définissant sur nil
, l'objet pointé - encore une fois - sera pris en charge par le GC.
Pour plus de détails sur le fonctionnement du garbage collector, voir Golang - Impossible de libérer de la mémoire une fois occupée par bytes.Buffer .
Si vous souhaitez définir nil, utilisez le pointeur au lieu de la valeur.
person1 := &Person{name: "Name", age: 69}
// Then you can set
person1 = nil