如何在go中删除struct对象?

red*_*ix_ 16 struct go

假设我有以下结构:

type Person struct {
    name string
    age  int
}
Run Code Online (Sandbox Code Playgroud)

如果我创建该结构的对象

person1 := Person{name: "Name", age: 69}
Run Code Online (Sandbox Code Playgroud)

如果我将此对象设置为nil

person1 = nil
Run Code Online (Sandbox Code Playgroud)

它不起作用,实际上它是一个类型赋值错误,但它适用于地图和切片.那么,我将如何删除对象,即解除分配?我查看了删除内置文档,但它从给定的地图中删除了一个条目.谢谢.

icz*_*cza 30

Go是一种垃圾收集语言.您不应该,并且您无法从内存中删除对象.这是垃圾收集者的职责责任,它会自动完成.垃圾收集器将在内存无法访问时正确地从内存中删除它们.

您可以分配nil给地图和切片,因为这些类型nil的有效值(零值).struct类型的零值不是nil一个struct值,其中所有字段的值都为零.

如果要清除或覆盖struct值,可以简单地为其指定另一个struct值,最好是零值(空结构):

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

// Clear person1:
person1 = Person{}
Run Code Online (Sandbox Code Playgroud)

但要知道这不会释放分配的内存person1; 如前所述,当GC无法访问时,它将自动释放.

nil也是指针类型的有效值(零值),因此如果person1是指向Person(即*Person)的指针,您也可以分配nil给它,例如:

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

// Clear person1:
person1 = nil
Run Code Online (Sandbox Code Playgroud)

通过将指针设置为清除指针时,nilGC将处理指向的对象-again-.

有关垃圾收集器如何工作的更多详细信息,请参阅Golang - 一旦被bytes.Buffer占用,就无法释放内存.


sad*_*lil 10

如果你想设置 nil 使用指针而不是值。

person1 := &Person{name: "Name", age: 69}
// Then you can set
person1 = nil
Run Code Online (Sandbox Code Playgroud)