您可以像这样使用runtime.SetFinalizer。有关游乐场版本,请参见此处。
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
请从文档中注意这一点,了解带有终结器的陷阱
x 的终结器计划在 x 变得无法访问后的某个任意时间运行。无法保证终结器会在程序退出之前运行,因此它们通常仅用于在长时间运行的程序期间释放与对象关联的非内存资源。