当前位置: 首页 > 面试题库 >

如何在Go中删除struct对象?

闾丘炫明
2023-03-14
问题内容

假设我有以下结构:

type Person struct {
    name string
    age  int
}

如果我将该结构作为对象

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

如果我将此对象设置为nil

person1 = nil

它不起作用,实际上是类型分配错误,但适用于映射和切片。那么,我将如何删除该对象(即取消分配)呢?我查看了内置的delete文档,但它从给定的映射中删除了一个条目。谢谢。


问题答案:

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

您可以分配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

通过将指针设置为清除指针时,nilGC将再次处理该指向的对象。



 类似资料:
  • 问题内容: 我想知道Go中的“ struct {}”和“ struct {} {}”是什么意思?示例如下: 要么 问题答案: 是Go中的关键字。它用于定义结构类型,结构类型是命名元素的序列。 例如: 的是一个具有零个元素类型。通常在不存储任何信息时使用。它具有大小为0的优点,因此通常不需要内存来存储type值。 另一方面是复合文字,它构造一个类型的值。复合文字构造用于类型的值,例如结构,数组,映射

  • 问题内容: package main 我想读入 我已经问了几个相关问题。 我已经阅读了一些文章和帖子,但仍然找不到解决方法。 问题答案: 我认为您正在以错误的方式进行操作。如果要使用C库,则可以使用C库读取文件。 不要纯粹使用cgo来拥有结构定义,您应该在Go中自己创建它们。然后,您可以编写适当的编组/解组代码以从原始字节读取。 快速的Google显示,有人已经完成了将相关C库的外观转换为Go所需

  • 另一个问题可能是“如何从内置类型继承?”。 我真的有两个问题,但它们都来自我玩的同一个东西。 首先,当我想进一步约束类型时,我可以创建它的子集。我用MyInt来做这件事,它接受任何Int的东西。我将一个变量声明为by MyInt并赋值给它,但当我检查它的名称时,得到的却是Int。那么,这是怎么回事? 但是,我真正想要的是一个名为的类,它做同样的事情。我可能想添加方法到 这看起来很有效,但我有一个错

  • 问题内容: 我对JavaScript的运算符有些困惑。采取以下代码: 执行完这段代码后,is ,但仍指与完全相同的对象。我猜这个对象是指向相同的对象。 这使我感到困惑,因为我希望写操作可以删除指向内存中的对象,而不仅仅是变量。 这是因为JavaScript的垃圾回收工作在保留/释放的基础,所以,如果我没有指向对象的任何其他变量,它 会 从内存中清除? (顺便说一下,我的测试是在Safari 4中完

  • 我如何删除Linkedlist中的对象。我有一个类帐户,里面有学生ID和学生名称。我输入列表中的对象,但是当我试图删除时,我不知道如何做。因为每次你从列表中间删除一个元素,它就会变得有组织,这意味着索引会改变。所以我如何获得学生ID属性并删除LinkedList中的对象。 样本: 我想让用户插入他想要删除的studentId,我可以做一个搜索和删除该对象的代码。 每次我从中间删除一个对象,它就会改

  • 这段代码运行良好,但我想知道它的性能,我指的是它的总体时间复杂度?