Go 如何跟踪类型实例的计数?

Go 如何跟踪类型实例的计数?,go,instance,destructor,Go,Instance,Destructor,在面向对象语言中,我使用类变量来跟踪当前通过构造时递增和销毁时递减生成的实例数量 我尝试在go中实现类似的行为: package entity type Entity struct { Name string } func New(name string) Entity { entity := Entity{name} counter++ return entity } var counter int = 0 func (e *Entity) Count(

在面向对象语言中,我使用类变量来跟踪当前通过构造时递增和销毁时递减生成的实例数量

我尝试在go中实现类似的行为:

package entity

type Entity struct {
    Name string
}

func New(name string) Entity {
    entity := Entity{name}
    counter++
    return entity
}

var counter int = 0

func (e *Entity) Count() int {
    return counter
}
这起到了一半的作用,因为我不能通过析构函数减少计数器

我能模拟物体破坏吗? 如何正确跟踪实例计数?

对于终结器,golang有一种狂热的想法

现在,

  • 没有终结器功能(编辑:没有可靠的终结器功能,正如Nick向我展示的那样)
  • GC不使用也不维护任何引用计数
因此,您必须自己管理实例计数

通常情况下,实例本身并不存在,因此对于许多实际用途(不包括复杂且难以理解的程序的分析),可以使用
defer
跟踪变量的生命周期结束。我不会假装这真的取代了终结器,但它很简单,而且通常已经足够了。

您可以这样使用。有关游乐场版本,请参见

package main

import (
    "fmt"
    "runtime"
)

type Entity struct {
    Name string
}

var counter int = 0

func New(name string) Entity {
    entity := Entity{name}
    counter++
    runtime.SetFinalizer(&entity, func(_ *Entity) {
        counter--
    })
    return entity
}

func (e *Entity) Count() int {
    return counter
}

func main() {
    e := New("Sausage")
    fmt.Println("Entities", counter, e)
    e = New("Potato")
    fmt.Println("Entities", counter, e)
    runtime.GC()
    fmt.Println("Entities", counter)
    e = New("Leek")
    fmt.Println("Entities", counter)
    runtime.GC()
    fmt.Println("Entities", counter)
}
这张照片

Entities 1 {Sausage}
Entities 2 {Potato}
Entities 0
Entities 1
Entities 0
请从带有终结器的gotchas文档中注意这一点

x的终结器计划在x之后的任意时间运行 变得遥不可及。不能保证终结器将运行 在程序退出之前,它们通常只对 在运行期间释放与对象关联的非内存资源 长期运行的程序


是否有内置方法显示对象上的引用计数?