假设我有下面这个结构体:
type Person struct {
name string
age int
}
如果我使用该结构体生成一个对象
person1 := Person{name: "Name", age: 69}
如果我将此对象设置为nil
person1 = nil
它不起作用,事实上这是一种类型赋值错误,但它适用于映射和切片。那么,我应该怎样删除对象,即回收内存?我查看了delete内置函数的文档,但它只能从给定的映射中删除一个条目。谢谢。
假设我有下面这个结构体:
type Person struct {
name string
age int
}
如果我使用该结构体生成一个对象
person1 := Person{name: "Name", age: 69}
如果我将此对象设置为nil
person1 = nil
它不起作用,事实上这是一种类型赋值错误,但它适用于映射和切片。那么,我应该怎样删除对象,即回收内存?我查看了delete内置函数的文档,但它只能从给定的映射中删除一个条目。谢谢。
Go是一种带有垃圾回收功能的语言。您不能删除内存中的对象,而且也没有必要这样做。这是垃圾回收器的职责和责任,它会自动进行处理。当对象变得不可达时,垃圾回收器将从内存中适当地移除它们。
您可以将maps和slices分配为nil
,因为nil
是这些类型的有效值(指零值)。对于struct
类型,其零值不是nil
,而是一个struct
值,其中所有字段都具有它们的零值。
如果您想清除或覆盖结构体值,只需将另一个结构体值(最好是空结构体的零值)分配给它即可:
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
来清除指针时,被指向的对象将再次由GC处理。
有关垃圾收集器如何工作的更多详细信息,请参见Cannot free memory once occupied by bytes.Buffer。
如果您想要设置为nil,请使用指针而不是值。
person1 := &Person{name: "Name", age: 69}
// Then you can set
person1 = nil