您可以這樣使用runtime.SetFinalizer。遊樂場版本見here。
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 變得無法訪問後運行。不能保證在程序退出前終結器將運行 ,因此通常它們僅在 長時間運行的程序期間釋放與對象關聯的非內存資源時纔有用。
是否有內置的方法來顯示對象的引用計數? –