2017-02-06 2 views
2

Скажем, у меня есть следующая структура:Как удалить объект struct в go?

type Person struct { 
    name string 
    age int 
} 

Если я объект этой структуры

person1 := Person{name: "Name", age: 69} 

Если я поставил этот объект ноля

person1 = nil 

это не работа, на самом деле это ошибка присваивания типа, но она работает для карт и срезов. Итак, как иначе я удаляю объект i.e deallocate? Я просмотрел документацию для delete builtin, но он удаляет запись с данной карты. Благодарю.

+0

Каждый элемент такой переменной или значения устанавливается равным нулевому значению для своего типа: false для booleans, 0 для целых чисел, 0.0 для float, «» для строк и nil для указателей, функций, интерфейсов, срезов, каналов , и карты. – BlackMamba

ответ

7

Go - это сбор собранных мусором языков. Вы не должны, и вы не можете удалять объекты из памяти. Это сборщик мусора обязанность и ответственность, чтобы сделать это, и он делает это автоматически. Сборщик мусора будет правильно удалять объекты из памяти, когда они становятся недоступными.

Вы можете назначить nil картам и срезам, потому что nil является допустимым значением (zero value) для этих типов. Нулевое значение для struct типов не nil, а значение struct, где все его поля имеют свои нулевые значения.

Если вы хотите, чтобы очистить или перезаписать значение структуры, вы можете просто assign другое значение структура к нему, предпочтительно нулевое значение (пустая структура):

person1 := Person{name: "Name", age: 69} 
// work with person1 

// Clear person1: 
person1 = Person{} 

Но знайте, что это не будет свободной памяти выделено person1; как было написано ранее, он автоматически будет освобожден GC, когда он станет недоступным.

nil также допустимое значение (нулевое значение) для типов указателей, так что если person1 будет указатель на Person (то есть, *Person), вы можете также назначить nil к нему, например:

person1 := &Person{name: "Name", age: 69} 
// work with person1 

// Clear person1: 
person1 = nil 

При очистке указателя, установив его на nil, заостренный объект -again- позаботится GC.

Подробнее о том, как работает сборщик мусора, см. Golang - Cannot free memory once occupied by bytes.Buffer.

+0

Как это будет работать в случае анонимных структур? –

2

Если вы хотите установить нулевой указатель на использование вместо значения.

person1 := &Person{name: "Name", age: 69} 
// Then you can set 
person1 = nil