web-dev-qa-db-fra.com

Comment supprimer un objet struct en go?

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.

16
redpix_

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 .

30
icza

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
4
sadlil