如何在 Go 中删除结构体对象?

43

假设我有下面这个结构体:

type Person struct {
    name string
    age  int
}

如果我使用该结构体生成一个对象

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

如果我将此对象设置为nil

person1 = nil

它不起作用,事实上这是一种类型赋值错误,但它适用于映射和切片。那么,我应该怎样删除对象,即回收内存?我查看了delete内置函数的文档,但它只能从给定的映射中删除一个条目。谢谢。


这样一个变量或值的每个元素都被设置为其类型的零值:布尔类型为false,整数类型为0,浮点数类型为0.0,字符串类型为"",指针、函数、接口、切片、通道和映射类型为nil。 - BlackMamba
2个回答

77

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


1
如果你想清除接收器,它必须是一个指针,并将一个空的结构体赋值给指向的值。 - icza
如果你想做某事却不能做,这真是太愚蠢了。 - JohnAllen

15

如果您想要设置为nil,请使用指针而不是值。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接