go - 如何在go中删除结构对象?

标签 go struct

假设我有以下结构:

type Person struct {
    name string
    age  int
}

如果我创建该结构的对象

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

如果我将此对象设置为 nil

person1 = nil

它不起作用,实际上它是一个类型分配错误,但它适用于 map 和 slice 。那么,否则我将如何删除对象,即解除分配?我查看了 delete builtin 的文档,但它从给定的 map 中删除了一个条目。谢谢。

最佳答案

Go 是一种垃圾收集语言。您不应该这样做,也不能从内存中删除对象。这样做是垃圾收集器的职责责任,它自动这样做。当对象变得不可访问时,垃圾收集器会正确地从内存中删除对象。

您可以将 nil 分配给映射和 slice ,因为 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 来清除指针时,指向的对象 - 再次 - 将由 GC 处理。

有关垃圾收集器如何工作的详细信息,请参阅 Cannot free memory once occupied by bytes.Buffer .

关于go - 如何在go中删除结构对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42066797/

相关文章:

http - 从 net/http.Request.RemoteAddr 获取 IP 地址最干净的方法是什么

GoSonar : how to generate go test -json > report. json

go - "|="运算符在 Go 中意味着什么?

go - 什么是 .exe~ 扩展名?

arrays - Julia 语言 : How to create an array of structs inside a for loop

c++ - Struct 中具有多个标记名称的构造函数 (C++)

c - EXC_BAD_ACCESS 在 C 中的结构内的字符数组上使用 QSort

c++ - N 叉树实现 : cannot convert 'Tree::node*' to 'node*' in assignment

pointers - 通过反射改变接口(interface)下的指针类型和值

c - 使用或不使用指针将结构传递给函数